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ドキュメントを見るのが手っ取り早い.