文字化けの仕組み
前回のブログで作成したツールを作成して、文字化けの仕組みについて書いてみようと思います。
なぜ文字化けが起こるか端的に言いますと、ファイルに書き込んだ文字エンコードとファイルを読み込んだ文字エンコードが異なるからです。
文字コードとは?
パソコンのディスクに保存されるあらゆるファイルは、バイナリ(2進数)で保存されています。テキストファイルも同様にバイナリのファイルとして保存されています。
そこで、保存されているバイナリの値を何の文字と対応させるかを決める必要があります。あるバイナリの値と、文字の対応を決めたものが文字エンコードです。
文章だけでは分かりづらいので、下図を見てください。
これは、保存したテキストファイルをShift_JISという文字エンコードで読み込んだ状態です。
1行目には「ABCDEFGHIJKLMN」という文字列が表示されています。
これがディスク上には「4142434445464748494A4B4C4E」(16進数)という値で保存されているのです。
次の図には「Hello World!」という文字列が表示されています。こちらは「48454C4C4F20574F524C4421」という値で保存されているのがわかります。
次の図には「こんにちは 世界!」という文字列が表示されています。
Shift_JIS では全角の日本語を2バイトで表します。
ですので、
「こ」→「82B1」
「ん」→「82F1」
「に」→「82C9」
「ち」→「82BF」
「は」→「82CD」
「 」→「8140」
「世」→「90A2」
「界」→「8A45」
「!」→「8149」
となります。
次の図はすべて文字化けしています。
これはなぜかと言いますと、このファイルはもともと「UTF-8」という文字エンコードで保存したためです。
UTF-8 で読み込むと正しく表示されます。
UTF-8 では
(※最初の「EFBBBF」は文字として認識されない特殊なバイナリです。)
「こ」→「E38193」
「ん」→「E38293」
「に」→「E381AB」
「ち」→「E381A1」
「は」→「E381AF」
「 」→「E38080」
「世」→「E4B896」
「界」→「E7958C」
「!」→「EFBC81」
となります。
同じ文章を保存してもエンコードが変わるとバイナリも変わってしまいます。
読み込み時に指定するエンコードを誤ると正しく文字にマッピングできません。これが文字化けの仕組みです。
ちなみに、4番目の図で文字化けしている「・ソ縺薙s縺オ縺。縺ッ縲荳也阜・」という文字列は Shift_JIS で、
「EFBB」→「・(該当なし)」
「BF」 →「ソ」
「E381」→「縺」
「93E3」→「薙」
「8293」→「s」
「E381」→「縺」
「AB」 →「オ」
「E381」→「縺」
「A1」 →「。」
「E381」→「縺」
「AF」 →「ツ」
「E380」→「縲」
「80」 → 無視?
「E4B8」→「荳」
「96E7」→「也」
「958C」→「阜」
「EFBC81」→「・(該当なし)」
という文字にマッピングされるため、上記のように表示されます。