拾ってきたスクリプトでは文字コード変換にはjcode.plを使っていた。ところが,jcode.plはutf8に対応していない。だからutf8があると表示が文字化けしていたのか。ところで,4つ前の投稿にも書いたが,最近のperlではモジュール,Jcode.pmとEncode.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,とでる。おや?これはもしや推定時に困ってるのか?と思い,ネットで検索。「perl Encode」などで検索していると,http://www.bugbearr.jp/?Perl%2FUnicodeというページにたどり着いた。そこには「自動判定したい場合は、Jcode.pm を使う。(Encode::Guess は望ましい動作をしないようだ…)」と書いてある。下の方の「文字コードを自動判別させるには」という所を見ると,どうやらEncodeモジュールの推定はちょっと甘くて,shift_jisかutf8かを決めてくれないみたい。Jcodeモジュールはどっちかわからない時にも,ある程度推定して,文字コードを特定するみたい。そこで,上記サイトにあるように,トップの方で
referer: http://xxxxxxxxxxx/yyy.cgi
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 件のコメント:
コメントを投稿