« もうむりです | メイン | AN HTTP が頻繁に落ちる »
2005年01月08日
Encode と Unicode::Japanese
昨年の半ばから、日本語変換には Unicode::Japanese を使っていたわけですが、よく考えると、単純に UTF-8 EUC SJIS 間の変換にしか使わないので、標準モジュール(Perl 5.8)である Encode を使うことにした。
自分の環境や使い方では、なんと Unicode::Japanese より Encode の方が、だいたい 10分の1 の CPU時間 で処理できることがわかった。
ただ、問題が無い事も無く、文字コードを判定して変換するのが上手く行かない場合が結構多い。
use Encode; use Encode::Guess qw/ euc-jp shiftjis 7bit-jis /; Encode::from_to($value, 'Guess', 'euc-jp');
こんな風に書けば、一般的には文字コードを判定して変換することができる(ほにゃららを EUC に変換する例)。そもそも from_to 単体でサポートして欲しいところなんだけど。
問題があって、自動認識に失敗すると CGI 全体で 500 エラー を吐き出しやがります。
というのは、上記のをもっとばらばらに書くと
$guess = Encode::Guess::guess_encoding($value); Encode::from_to($value, $guess->name, 'euc-jp');
といった風になるのですが、文字コード判定に失敗すると $guess にオブジェクトとではなく、普通のテキストが入るんですよねorz
$guess = Encode::Guess::guess_encoding($value); if (ref $guess && $guess->name ne 'euc-jp') { Encode::from_to($value, $guess->name, 'euc-jp'); }
こんな風に書いて解決しました。文字コードの取得に失敗したら変換しないということで。
Encode の仕様というかバグなんじゃないのか?これは。
あと、変換が
$length = Encode::from_to($value, $before, $after);
これしか無くって、渡した $value がもれなく変換されるのもちょっと嫌。他の関数に、変換した値だけ($value 自体はそのまま)を渡したいときもあるんだけど。というか、これに1時間くらいはまった。
2005年01月08日 17:10 | Programming