« もうむりです | メイン | 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

トラックバック

コメント