[an error occurred while processing this directive]
[an error occurred while processing this directive]
文字化けシミュレータ
Shift-jis/euc/utf-8の文字化けをシミュレートする豆スクリプトです。
設置例は
こんな感じです。
ダウンロード向けのzipファイルを作りました。
ご自由に設置してみてください。
- mojibake.zipをダウンロード
- 全てのファイルを展開してサーバに転送します
- 中にあるcgi-lib.plとmojibake.cgiを実行可能にします (FFFTPなどで755に設定するなど)
- index.htmlにアクセスします。
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ファイルをご参照ください。
[an error occurred while processing this directive]