funini.com 自由研究 文字化け

文字化けシミュレータ

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)