UTF-8とShift_JISのHEXが違う理由
同じ「あ」や「日本」という文字でも、UTF-8で変換した場合とShift_JISで変換した場合では、表示されるHEXが変わります。これは変換ミスではなく、文字コードごとに文字をバイトへ置き換えるルールが違うためです。
この記事の要点
- HEXは文字そのものではなく、文字コードで変換された後のバイト列です。
- UTF-8とShift_JISでは、日本語をどのバイト列で表すかが違います。
- CSVや古い業務システムでは、Shift_JISではなくWindows-31Jが前提になっている場合もあります。
UTF-8とShift_JISでHEXが変わる理由
文字列を保存・送信するとき、コンピューターは文字コードに従って文字をバイト列へ変換します。UTF-8とShift_JISはどちらも日本語を扱えますが、文字とバイト列の対応表が同じではありません。
文字列 → 文字コードを選ぶ → バイト列が決まる → HEXで表示するつまり、HEXが違うのは変換ミスとは限りません。どの文字コードで符号化した結果なのかをセットで見ることが大切です。
日本語文字列の変換例
たとえば「あ」はUTF-8では3バイト、Shift_JISでは2バイトになります。同じ画面上の文字でも、実際のバイト列は次のように異なります。
| 文字列 | UTF-8のHEX | Shift_JISのHEX | ポイント |
|---|---|---|---|
| あ | E3 81 82 | 82 A0 | UTF-8は3バイト、Shift_JISは2バイト |
| 日本 | E6 97 A5 E6 9C AC | 93 FA 96 7B | 2文字分のバイト列が続く |
| ABC | 41 42 43 | 41 42 43 | ASCII範囲では同じ結果になりやすい |
| ア | EF BD B1 | B1 | 半角カナは文字コード差が出やすい |
| 😊 | F0 9F 98 8A | 変換不可の場合あり | Shift_JISでは表せない文字の例 |
英数字だけを見ると差が出ないことがあります。そのため、日本語を含むデータで文字化けが起きたときは、文字コードの指定を特に確認します。
ツールで比較する方法
- 文字列16進数変換ツールを開きます。
- 文字列欄に比較したい文字を入力します。
- 文字コードをUTF-8にしてHEXを確認します。
- 文字コードをShift_JISに切り替え、結果の差を確認します。
CSV、メール本文、古い業務システム向けデータなどはShift_JISが指定される場合があります。WebページやAPI連携ではUTF-8指定が多いため、データの受け渡し先に合わせて確認しましょう。
CSVで文字化けするときの考え方
たとえばUTF-8で作成したCSVを、古いExcelやShift_JIS前提のシステムで開くと、日本語が文字化けすることがあります。これは、保存したときの文字コードと、読み込む側が想定している文字コードが違うためです。
HEXで確認すると、同じ「日本」でもUTF-8では E6 97 A5 E6 9C AC、Shift_JISでは 93 FA 96 7B になります。読み込み側がどちらを期待しているかを合わせることが重要です。
どちらの文字コードを選ぶべきか
- WebページやJSON API:基本的にはUTF-8を選びます。
- Excel向けCSV:受け取り側の仕様によってShift_JISが必要な場合があります。
- 既存システム連携:仕様書やサンプルファイルの文字コードに合わせます。
- 原因調査:疑わしい文字コードを複数試し、読める文字列に戻るか確認します。
日本のCSVではWindows-31Jにも注意
日本の業務システムやExcel向けCSVでは、「Shift_JIS」と書かれていても、実際にはWindows-31J(CP932)を指していることがあります。Windows-31JはShift_JISをもとにした文字コードで、丸数字や一部の記号、機種依存文字の扱いが関係します。
そのため、仕様書に「Shift_JIS」とだけ書かれている場合でも、実際の受け取り側がWindows環境なのか、厳密なShift_JISなのかを確認すると安全です。
Shift_JISで表せない文字がある
UTF-8は現在のWebで広く使われ、多くの文字や絵文字を扱えます。一方、Shift_JISでは表せない文字があります。たとえば絵文字や一部の記号、旧字体の一部は、変換時に ? になったり、エラーになったりすることがあります。
CSVや古いシステムへ送るデータでは、文字コードだけでなく、使える文字の範囲も確認しておく必要があります。
比較時の注意点
- コードポイントと混同しない:UnicodeのU+3042とUTF-8の
E3 81 82は別の表記です。 - 区切りは表示用:
E38182とE3 81 82は同じ3バイトを表せます。 - 判定は一意とは限らない:短いHEXだけでは文字コードを確定できないことがあります。
- 半角カナに注意する:Shift_JISやWindows-31Jでは半角カナや機種依存文字の扱いが問題になることがあります。CSVや既存システム連携では、サンプルデータで事前に確認します。
よくある質問
同じ文字なのにUTF-8とShift_JISでHEXが違うのはなぜですか?
文字コードごとに、文字をどのバイト列へ割り当てるかの規則が違うためです。HEXはそのバイト列を16進数で表示したものなので、文字コードが変わると結果も変わります。
WebではUTF-8とShift_JISのどちらを使うべきですか?
現在のWebページやAPIではUTF-8が一般的です。ただし、古い業務システムや一部のCSV連携ではShift_JISが指定されることがあります。
HEXだけを見れば文字コードを必ず判定できますか?
必ず判定できるとは限りません。同じバイト列が複数の文字コードで別の文字として解釈できる場合があるため、仕様や周辺情報も合わせて確認します。
Shift_JISとWindows-31Jは同じですか?
厳密には同じではありません。ただし日本の実務では、Shift_JISと書かれていてもWindows-31J(CP932)を指していることがあります。CSVや業務システム連携では仕様を確認するのが安全です。
Shift_JISで絵文字は変換できますか?
多くの絵文字はShift_JISでは表せません。変換時に ? になったり、エラーになったりすることがあります。絵文字や多言語の文字を扱う場合はUTF-8が向いています。
Excel向けCSVはUTF-8とShift_JISのどちらがよいですか?
新しい環境ではUTF-8のCSVも扱えますが、古いExcelや業務システムではShift_JISやWindows-31Jが指定されることがあります。提出先や取り込み先の仕様に合わせて選びます。