2009年2月9日月曜日

FreeBSD:Unicodeにはまる

今回もFreeBSDネタ。以前もちょっと書いたが,今回も文字コードの話。最近のPerl (Perl 5.8.8や5.8.9) では,内部処理ではutf8を使っているらしい。でもunix上では未だにeucが使われていたり,windowsやmacintoshではshift_jisを使っている。そこで必要なのが文字コードの変換。apacheで表示させる時に,どの文字コードを使うのかは,アプリケーション次第。新しく作ったサイトはいきがってutf8にしてみたが,net上に落ちてるスクリプトはshift_jisだったりする。以前,アクセスログを取り,解析,表示してくれるスクリプトを拾ってきた。windowsを念頭においているのか,文字コードはshift_jisで書かれていた。別にそれはよいのだが,このアクセスログ解析スクリプトが表示する検索文字列がよく文字化けする。おかしいなぁ,と思ってブラウザの文字コードをutf8にしたら文字化けしてたところだけちゃんと見えて,今までちゃんと見えていた検索語が化ける。しばらくそのまま使っていたが,どうも気になって仕方ない。そこで,ちょちょいと調べてみた。
 拾ってきたスクリプトでは文字コード変換にはjcode.plを使っていた。ところが,jcode.plはutf8に対応していない。だからutf8があると表示が文字化けしていたのか。ところで,4つ前の投稿にも書いたが,最近のperlではモジュール,Jcode.pmEncode.pmを使うみたい。投稿を書いた時にはEncodeモジュールを使ったのだが,その使い方は、
---------------------------------------------------
cgiのトップに
use Encode;
use Encode::Guess qw/ shiftjis euc-jp utf8 7bit-jis /;
と書いておき、
$in_name = encode('utf8', decode('Guess', $in_name));
とすると、もとの文字コードを推定して、utf-8に変換してくれる。
---------------------------------------------------
ってな感じだった。今回もutf8に対応していないjcode.plのconvertルーチンを使っているところを探して,encodeとdecodeを使って,
$in_name = encode('shiftjis', decode('Guess', $in_name));
としてShift_JISに変換してやればいけるはず,だった。
 ところが,これがうまくいかない。解析ルーチンのcgiが途中で止まってしまう。どこで止まっているかと言うと,utf8の文字列が出てきたところ。そこで止まって,それ以上表示してくれない。困った。apacheのエラーログ,/var/log/httpd-error.logを見ると
shiftjis or utf8 at /usr/local/lib/perl5/5.8.8/mach/Encode.pm line 166, 
     referer: http://xxxxxxxxxxx/yyy.cgi
とでる。おや?これはもしや推定時に困ってるのか?と思い,ネットで検索。「perl Encode」などで検索していると,http://www.bugbearr.jp/?Perl%2FUnicodeというページにたどり着いた。そこには「自動判定したい場合は、Jcode.pm を使う。(Encode::Guess は望ましい動作をしないようだ…)」と書いてある。下の方の「文字コードを自動判別させるには」という所を見ると,どうやらEncodeモジュールの推定はちょっと甘くて,shift_jisかutf8かを決めてくれないみたい。Jcodeモジュールはどっちかわからない時にも,ある程度推定して,文字コードを特定するみたい。そこで,上記サイトにあるように,トップの方で
use Jcode;
と宣言しておいて,
my $sjis = jcode($str)->sjis;
としてみた。そしたらうまくいった。うーん,やっぱりperlは奥が深いですねぇ。
======================================================================
(追記)
後日、自分で記事を参考にしたのだが、Jcode.pmをどうやってインストールしたのか忘れてしまっていた。どうしたかというと、FreeBSDなので、
/usr/ports/japanese/p5-Jcode/
からインストールした。/usr/ports/japanese/p5-jcode.pl/はjcode.plをインストールしてしまうので、間違えないようにしましょう。

0 件のコメント: