Perl5.8でdecodeが失敗する。

Perl5.8でdecodeが失敗する。

find_encoding('utf8')->decode($data);

とすると、こんなメッセージ出す。

Cannot decode string with wide characters. 


入力データ($data)はUTF8の文字列。

guess_encoding($data, qw/shiftjis utf8 ascii/)->name   #=> utf8

解決方法はhttp://lab.z-nix.jp/mt/archives/2005/10/ にあった。アリガト!(´▽`)。

で、結局ソリューションは??と聞きたくなるのですが、ようは UTF-8 のフラグが立ちまくっているので、
その状態ではEncodeできませんよということだ。つまり UTF-8 のフラグを降ろせば先程のエラーは出なくなるはず。UTF-8 フラグについては延々と書かれているのですが、とりあえずフラグに関するメソッドを探してみるとありました。
utf8_off(STRING)
これで UTF-8 フラグを降ろしてあげたら見事に Encode に成功です。

ということで以下のように修正。

Encode::_utf8_off($data);
find_encoding('utf8')->decode($data);

本処理と関係ないので無視してしまったが、実は、上記対応をすると
文字コードを調べるために使用したとした、

guess_encoding($data, qw/shiftjis utf8 ascii/)->name . "\t";

でエラーが出ていた。

Can't locate object method "name" via package "shiftjis or utf8"
 (perhaps you forgot to load "shiftjis or utf8"?) at

Guess.pmをさらっと読む限りではguess_encodeingの第2引数 qw/shiftjis utf8 ascii/ をどこで使っているかよくわからない。本処理に関係ないので、ここはコメントアウトしておいて、深追いはしないことにする。