Encode::Guessではまる
いつものパターン
Wide character in print at ...
これはUTFフラグがついた文字列をprintしようとしているから.encodeしてあげればよい.
use Encode; #これいるのかな?要確認 print encode('utf-8', $string);
これは瞬殺.次は見慣れないエラー
shiftjis or euc-jp at /usr/local/lib/perl5/5.8.7/mach/Encode.pm line 166
調べたところ原因は,
- Encode::Guess は、decode に失敗したものをリストから取り除くという動きをする。
- decode できたものが複数だった場合、リファレンスではなく、decode に成功した方式の文字列を返す。("shiftjis or euc-jp", "euc-jp or utf8" など)
だそうだ.(引用:http://www.bugbearr.jp/?Perl%2FUnicode)
今回はGuessに失敗してもそのまま活かすようなロジックにしたかったので,こんな風に解決
my $enc = guess_encoding($title, qw/euc-jp shiftjis 7bit-jis/); # guessに成功したら if(ref($enc)){ $title = decode($enc->name, $title); $title = encode('utf-8', $title); # 失敗したら }else{ $title = $url; }
CPANドキュメントを見るのが手っ取り早い.