Perl5.8になってEncodeモジュールが導入されJcodeは必要なくなりました。はずでした。
Encode::Guessは文字コードを判定するモジュールなのですが特に短い文字列に対してわりとよく判定に失敗します。判別の方法は「decodeしてみて成功すればOK」というものなので複数の文字コードでdecodeできてしまうと絞り込めないのです。
Encode::Guessのドキュメントより引用
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
そんなこと言われてもなー。文字コードが分からないから自動判別したいのに。
対してJcodeモジュール。Ver 2.0からはEncodeモジュールのラッパとして動作するので安心して使えます。Jcodeでの文字コード判別は「一番多くマッチした文字コードが選択される」というものなのでEncodeよりも精度は高くなります。日本語限定ならこっちのほうがよいようです。
文字コードを自動判別してPerlの内部形式にdecodeするには、Encode::Guessを使う方法だと、
$decoded = Encode::decode('Guess', $bytes);
などとやりますが、日本語限定ならJcodeを使って、
$decoded = Encode::decode('utf8', Jcode->new($bytes)->utf8);
とでもやるほうがいいのかな。
Perlの日本語処理はどうもめんどくさい方に行ってるような気がします。すべての文字コードがUTF-8になれば楽になるんでしょうけど。