Encode::GuessとJcode

Perl5.8になってEncodeモジュールが導入されJcodeは必要なくなりました。はずでした。
Encode::Guessは文字コードを判定するモジュールなのですが特に短い文字列に対してわりとよく判定に失敗します。判別の方法は「decodeしてみて成功すればOK」というものなので複数の文字コードでdecodeできてしまうと絞り込めないのです。

Encode::Guessのドキュメントより引用
                                                                                • -
It is, after all, just a guess. You should alway be explicit when it comes to encodings. But there are some, especially Japanese, environment that guess-coding is a must. Use this module with care. つまりはこのモジュールは推測するだけです。エンコーディングを扱うときには陽に指定すべきでしょう。guess-codingな一部の、特に日本語環境では必須です。注意深くこのモジュールを使ってください。

そんなこと言われてもなー。文字コードが分からないから自動判別したいのに。

対して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になれば楽になるんでしょうけど。