SheepDev

エンコード・文字コード

この16進バイト列は何の文字?UTF-8として確かめたい

使うツール

ログに文字そのものではなく、e3 81 82のような数字が並んでいる。16進数だとは分かっても、三つの値が三文字なのか、一文字なのかは表記だけでは決まりません。バイト列を文字へ戻すには、どの文字コードで書かれたかという条件が必要です。テキスト⇔バイト列ではUTF-8を使い、短い既知の文字から、文字・バイト・表示形式の関係を確認できます。

『あ』を三つのバイトへ変える

最初の文字入力
あ

テキストからバイト列へ変換すると、16進数はe38182(読みやすく区切るとe3 81 82)、2進数は11100011 10000001 10000010、バイト数は3になります。これらは別々のデータではなく、同じ三つのバイトを異なる数の表記で示したものです。16進数の二桁で一バイト、2進数の八桁で一バイトというまとまりを見ます。スペースは読みやすく区切るための表示で、元の文字『あ』に空白が含まれているわけではありません。

次に復元モードへ切り替え、形式を16進数として、結果のhex部分だけを入力します。文字として『あ』へ戻れば、この経路では往復できています。出力全体のJSONやhexという項目名まで貼るのではなく、バイト列そのものを使います。形式を2進数へ切り替える場合も、対応する八桁ずつの列を入力し、16進数の文字列をそのまま読み替えないようにします。

英字、日本語、絵文字を一つずつ足す

長さを比較する文字列
Aあ😀

Aは41の一バイト、あは三バイト、😀はf0 9f 98 80の四バイトなので、この例の合計は八バイトです。見た目の三文字とバイト数が一致しない理由を、値を一つずつ消して確かめます。文字数・バイト数ツールでも同じ入力を測り、表示上の文字数、コードポイント数、UTF-16単位数、UTF-8バイト数が違う概念であることを比較できます。

この八バイトを16進数で連結すると十六文字になりますが、元のデータが十六バイトへ増えたという意味ではありません。ただし、その16進表記をテキストとして別のファイルへ保存すれば、その表記自体の容量が発生します。データのバイト数と、バイトを人へ見せるための文字列の長さを分けると、ログの長さや送信上限を取り違えにくくなります。

バイトを途中で切ると、文字へ戻らない

末尾を失ったUTF-8
e3 81

あの末尾82を取り除いたこの入力は、UTF-8として完全ではないため復元に失敗します。ここで適当な値を足してエラーを消しても、元が何の文字だったかを確認したことにはなりません。ログの長さ制限や通信の切断で途中までしか記録されていないなら、元データを取得できる場所まで戻ります。エラーを黙って置換文字へ変えないことは、破損を見つける手掛かりになります。

同様に、16進数の桁数が奇数だったり、gなど16進数ではない文字が混じったりすれば、文字コードの判定より前にバイト列としての入力が不正です。まず表記を検証し、次にそのバイトがUTF-8として読めるかを確かめます。二つの段階を分けると、『文字化け』という一言に、転記ミス、切り詰め、文字コード違いを混ぜずに説明できます。

読めないからといって、暗号とは限らない

このツールの復元はUTF-8として読みます。別の文字コードのファイル、圧縮されたデータ、画像、暗号文を入力しても、元の内容を推測して復元するものではありません。Shift_JIS系の文字コードだと分かっている場合は、対応するファイル文字コード変換へ進みます。何度も別の解釈を試して偶然読める文字が出たことだけを、文字コードが確定した根拠にしないでください。

UnicodeのU+3042という表記も、UTF-8のバイト列e3 81 82とは別です。コードポイントは文字の番号、UTF-8はそれをバイトへ符号化する方式です。U+3042の3042をそのまま16進バイトとして入力しても、あのUTF-8表現にはなりません。ログが何を表示しているのか、フィールドの説明でコードポイントなのかバイト列なのかを確かめてから道具を選びます。

見えない改行も、一つずつバイトになる

Aだけなら41ですが、その後にLFの改行があると41 0aになります。Windows系のCRLFなら41 0d 0aです。画面では同じように次の行へ進んでいても、ハッシュや署名の入力としては違うバイト列です。コピーした文字列の末尾に改行が付いたかを確かめたいときは、この表示で末尾のバイトを見ます。変換前に改行を勝手に削除すると、元の違いを調べられなくなります。

調査結果には、元の文字列、UTF-8である根拠、選んだバイト表記、期待する長さを残します。『同じ文字に見える』だけでは一致を保証できません。一方で、バイトが違うから必ず文字の意味も違うとは限らず、Unicode正規化の違いなど別の要因もあります。バイト列の一致を調べる作業と、人が同じ文字として読むかを調べる作業を分ければ、次に使うツールを選びやすくなります。

参考資料

使うツール

使い方・解説 →