和田憲幸のブログ

札幌市白石区在住、個人事業のWebエンジニア 和田憲幸(45歳)のブログです。

Jcodeの波ダッシュ文字化けについて

Jcodeを使った際に必ず直面する波ダッシュ(~)の文字化けについての話。

2009-01-10 08:36:07
入力時間 / 19:34

今まではJavascriptでゴリ押ししたり、Jcodeモジュール自体を差し替えるという手段をとっていましたが、今回メールフォームプロの安定化にあたって逃げてちゃ駄目だなということでちゃんと置換で対処しました。

プログラムにおける文字とは

まず文字ってのがどういう成り立ちなのかの説明から。パソコンが認識できるのは0か1のみ。その中で文字を出力するために文字にはコードがあります(いわゆる文字コードとは別です)。例えば波ダッシュの場合、Shift_jisで「817C」という16進数の文字コードがあります。で、その16進数がコンピュータで理解されるときは2進数になるわけなんですが、人間が見ている文字情報はすべてこのように番号が割り振られているんですね。まずそれが文字のコード。

文字コードとは

で、これが本当に厄介というか旧世代の産物なのですが「文字コード」というのがあります。それはその文字のコード(チャート)の根本的な違いによって派生した多くの規格なわけです。日本で古くから使われているJIS(ISO-2022-JP)やWindowsの日本語版で標準実装されているShift_jis、現在多くのWebサイトやMacOS、Linuxなどで使われているUTF-8。これらの文字コードというのは単純に参照する「文字の番号表」が違うだけなんです。そして相互乗り入れが出来ないという致命的な欠陥があり、多くのプログラマを悩ませる悪しき遺産でもあるわけです。

文字コード別に文字コードを見てみましょう

波ダッシュで言うと
Shift_jisで817C
JISで1B24B21A1B28J
UTF-8でEFBD9E
となります。あーめんどくせぇ。

なぜJcodeで波ダッシュが文字化けするか

で、日本語を各文字コードにアウトプットしてくれるJcodeは波ダッシュ(~)と全角チルダ(-)の処理が抜けてるんですね。Jcodeはどうやって文字コードを相互変換しているかというと、膨大な量のチャートを実行して単純に文字を一文字一文字置き換えてるんです。で、チャートの中に対象文字が無いために文字化けや??になったりするわけですね。なのでJcodeのチャートの中にそれを書き足せば解決はするのです。でも大体のサーバではJcodeがすでにインストールされているため、書き換える事ができないんですね。

上記を踏まえてPerlで波ダッシュを置き換える

ということで波ダッシュを置き換える処理を追加してみましょう。今回はJISに変換する場合のケースです。
01.まず対象の文字を識別子へと置き換えます

$str =~ s/~/<_hotfix_wavedash_>/g;

02.次に文字コードをJcodeを使ってJISに変換します

Jcode::convert(¥$str,'jis');

03.最後にJISコードの波ダッシュを先ほど置き換えた識別子と置き換えます

$str =~ s/<_hotfix_wavedash_>/¥x1b¥x24B¥x21A¥x1b¥x28J/g;

で終わり。ということになりますね。¥xはPerlの正規表現で16進数のアスキーとしてという意味です。まぁよくわからないですがこうなるってことですね。

と言うことで長きに渡って対応してこなかった問題ですが、これで一応メールフォームプロで波ダッシュが化ける事は無くなるでしょう。あ~よかった。

P.125