文字コード掲示板


記事表示


No.054投稿日時:2003/04/13(日) 16:12    <↑親記事:No.052>
投稿者:森山 将之

Perlを使ったCGIで文字化けしない半角カナ対策

そもそも Perl 使用の CGI で半角カナが文字化けするのは次のような理由によります。

1.ブラウザから送られてくるデータの文字コードが不定であるという認識の元、jcode.pl の convert() 関数の第3引数に入力文字コードを指定せずに文字コード変換を行っている。
2.convert() 関数は、第3引数の指定が無い場合は、getcode() で文字コードの自動判定を行うが、この関数は半角カナが入っていないという前提で文字コードの判定を行っている。

つまり、元々半角カナに対応してない getcode() を使うようになっているので半角カナで文字化けするのは当然と言えます。ですので、convert() に第3引数を与えないまま、あれこれいじったところで結局は何の解決にもなりません。

では、どうしたら良いかというと、次のような方法が考えられます。

方法1 最近のほとんどのブラウザでは送信してくる文字コードは入力フォームのページの文字コードと同じであると事を利用して、文字コードの変換をやめてしまう。
方法2 convert() の第3引数に入力文字コードを指定して文字コード変換を行う。

方法2は、ブラウザが送信してくる文字コードを別の方法で決定する必要があり、例えば次のような方法が考えられます。

入力フォームに次のタグを挿入しておく。
<input type="hidden" name="kcode" value="あ">

CGIスクリプトで 'kcode' の値を取り出し、エスケープシーケンスが入っていれば JISコード、"\x82\xA0" だったらシフトJIS、"\xA4\xA2" だったら日本語EUC、"\xE3\x81\x82" だったら UTF-8 という具合に文字コードを決定する。

私の設置している掲示板では、この方法を使いブラウザが送信してきた文字コードを $icode に代入して jcode.pl の convert() 関数を次のように呼び出して使っています。(jcode.pl は UTF-8 未対応ので注意)

jcode::convert(\$value, 'sjis', $icode, 'z');

'kcode' の値を取り出し文字コード判定する処理は、次のようなライブラリを作って対応しています。http://www2d.biglobe.ne.jp/~msyk/software/kcode.txt (kcode.txt を kcode.pl で保存)

この方法だと、getcode() が呼び出されないので半角カナの制限は無く、$value に半角カナが入っていても正しく文字コード変換でき、半角カナは全角文字に変換されるようになります。

ただ、最近のブラウザの送信してくる文字コードは入力フォームのページの文字コードと同じ物である事がほとんどであるという現状を考えると方法1でも十分であると思っています。


Script : Sylpheed 1.24
Modified by MORIYAMA Masayuki