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/ をどこで使っているかよくわからない。本処理に関係ないので、ここはコメントアウトしておいて、深追いはしないことにする。