文字化けシミュレータ

Shift-jis/euc/utf-8の文字化けをシミュレートする豆スクリプトです。 設置例はこんな感じです。
ダウンロード向けのzipファイルを作りました。 ご自由に設置してみてください。

Webアプリの鬼門

文字化けはphpやサーブレットといったwebアプリで起こるイヤな問題です。 問題は世の中のwebページに4種類の文字コード(iso-2022-jp, shift_jis, euc-jp, utf-8) があり、また色んなソフトがおせっかいな変換をしてくれたり、しなかったりすることです。
ここでは文字化けが起こったとき、何が起こっているのかを調べるヘルプを書いてみます。

なぜ文字化けが起こるのか

パソコンではデータは全て数字の列で表されています。"a"という文字は数値で97(16進数で0x61)と表します。これをAsciiコードと呼び、これを用いないコンピュータはまずありません。
しかし、日本語の"あ"という文字をどう表現するかは以下のように分かれています。
utf-8 shift_jis euc-jp
e3 81 82 82 a0 82 a0
(e3とか82とかは16進数ですが、特に16進法だということを意識する必要はありません。)
だから、「ああ」とutf-8で書いた文字列を無理矢理shift_jisで読もうとしても、それは「ああ」とは読めません。「ああ」(utf-8)という文字列は
e3 81 82 e3 81 82
となりますが、これはshift_jisでは
縺ゅ≠
読めてしまいます。なぜなら"縺"の文字コードが e3 81, "ゅ"の文字コードが 82 e3, "≠"の文字コードが 81 82だからです。 euc-jpでは該当するコードが無いため、???や空白ななってしまいます。
この問題をまとめると、世の中にはshift_jisの文字列、euc-jpの文字列、utf-8の文字列の3種類のデータがあり、また表示装置(ブラウザやエディタ)にもshift_jisの表示器、euc-jpの表示器、utf-8の表示器の3種類があります。全部で3x3の9通りの組み合わせがあり、このうち3種類が正解です。他の場合(shift_jisを無理矢理eucとして表示した場合など)は文字化けを起こしてしまいます。

文字化けシミュレータ (with Ajax)

実際に文字化けがどんな風に起こるかシミュレートしてみるスクリプトを書きました。 下のフォームに元データを入れて送信すると、エンコーディングの誤りにより文字化けが起こる様子が見られます。 (要JavaScript)

色んな例

あああ

- Document: utf-8
e3 81 82 e3 81 82 e3 81 82
Document: euc-jp
a4 a2 a4 a2 a4 a2
Document: shift_jis
82 a0 82 a0 82 a0
Display: utf-8 あああ 〓〓〓 ??????
Display: euc-jp 縺ゅ≠縺 あああ あああ
Display: shift_jis 縺ゅ≠縺 、「、「、「 あああ

あいうえお

- Document: utf-8
e3 81 82 e3 81 84 e3 81 86 e3 81 88 e3 81 8a
Document: euc-jp
a4 a2 a4 a4 a4 a6 a4 a8 a4 aa
Document: shift_jis
82 a0 82 a2 82 a4 82 a6 82 a8
Display: utf-8 あいうえお 〓〓〓〓〓 ??¢〓〓¨
Display: euc-jp 縺ゅ>縺縺医 あいうえお あいうえお
Display: shift_jis 縺ゅ>縺縺医 、「、、、ヲ、ィ、ェ あいうえお

表示

- Document: utf-8
e8 a1 a8 e7 a4 ba
Document: euc-jp
c9 bd bc a8
Document: shift_jis
95 5c 8e a6
Display: utf-8 表示 ???? ??Φ
Display: euc-jp 茵蛯ク 表示 表ヲ
Display: shift_jis 陦ィ遉コ ノスシィ 表示

東京都

- Document: utf-8
e6 9d b1 e4 ba ac e9 83 bd
Document: euc-jp
c5 ec b5 fe c5 d4
Document: shift_jis
93 8c 8b 9e 93 73
Display: utf-8 東京都 ?? ??????
Display: euc-jp 譚延根驛ス 東京都 東京都
Display: shift_jis 譚ア莠ャ驛ス ナオナヤ 東京都

文字化けの解決

まず、どの文字コードからどの文字コードに変換されて(あるいはされないで)文字化けが起こっているのかを調べます。出力したかった文字列を上のスクリプトに入れてみて、どれが実際の出力に近いかを調べてみるといいでしょう。それにより、どの文字コードからどの文字コードに変換されて(あるいはされないで)文字化けが起こっているのかを調べて、実際のプログラムと見比べましょう。

処理系のおせっかい

さらに問題が複雑になっているのが、様々なソフトが自動的に便利を図って文字コードを自動変換してくれることです。例えばphp/apacheやTomcatには、phpファイルが書いてある文字コードと実際に画面に表示される文字コードを自動的に変換する機能が付いています。これを用いると、例えばunixのサーバ上でeucで書かれた文書を、毛携帯向けにshift_jisで表示することができます。しかし、もし元々の文書がshift_jisになっていると、文字化けを起こしてしまいます。 これらは、まず変換機能を手当たり次第にoffにして、必要なものを手作業でonにしていくのが最も確実だと思います。

ソース

上のzipファイルをご参照ください。