前回に続き、今回は文字化けの詳細な仕組みについてメモを残していこうと思います。
よくあるパターンのUTF-8からShit-JIS間で起こる文字化けを例に取ります。
文字化けさせる文
以下の文を文字化けさせていきます。
あいうえお
いろはにほへと
hogehoge fugafuga
UTF-8からShit-JIS
UTF-8 | Shift-JIS |
---|---|
あいうえお / いろはにほへと / hogehoge fugafuga | 縺ゅ>縺?∴縺 / 縺?m縺ッ縺ォ縺サ縺ク縺ィ / hogehoge fugafuga |
ということで、UnicodeであるUTF-8からShit-JISで変換すると糸編の漢字が頻出します。
これは、文字コードのうち何バイトを一文字とするかの解釈が異なるために発生します。
UTF-8は3バイトを全角一文字として解釈するのに対し、Shift-JISは2バイトで全角一文字となります。
一方で半角文字は双方とも1バイトで一文字なので、先述の解釈違いは基本的に起きません。(hogehoge fugafugaのところ)
ちなみに、UTF-8では文字コード「E3 81 8*」あたりが「平仮名」に対応し、Shift-JISでは「縺+何か半角文字」にあたります。
文字コード | UTF-8 | Shift-JIS |
---|---|---|
E3 81 BB E3 81 92 | ほげ | 縺サ縺 |
※さらに上図の補足をしておくと、SJISにおける「92」の1バイト解釈文字は存在しないわけではなく、「EM(End of Medium)」という記録媒体の終端に辿り着いたかどうかを示す制御文字という特殊な文字になります。
※制御文字が出てきたので、さらに余談ですが文字コード「0A」は改行を意味する制御文字で、十進数では「10」になります。そのため、例えばスプレッドシートで「char(10)」とすると改行が出力されます。
文字化けの戻し方
1.使用しているソフト(メーラー、テキストエディタ等)のエンコード設定を変える
2.復元ツールを使う(完璧ではない)
メールの文字化けや、CSVの文字化けについては使用しているメーラーやテキストエディタのエンコード設定を変更すれば大抵解決します。
それでもダメなとき(元の文字コード自体を上書きしてしまった場合等)は、ネット上に転がっている復元ツールを使うといいでしょう。
ただ、先述の通りUTF-8とShit-JISではエンコード時のバイト数が異なるために、一部の文字コードは捨てられるもしくは「?」で表示されてしまいます。
そんなときは元データを再度手に入れるか、復元できているいくつかの文字から解読していくしかないかなと思います。
参考
・各文字のエンコード・デコードをしてくれるサイト
http://www.edu.i.hosei.ac.jp/~sigesada/kyouzai/mojicodehenkan.html
・SJISの文字コード表
http://charset.7jp.net/sjis.html
・Unicodeの文字コード表
http://ash.jp/code/unitbl21.htm