まとめると以下のようになる。eucjpの文字列を読んで、decodeする。decodeした文字列は元の文字列のエンコードに依存ぜず、強制的にutf8。出力する前にencode。DATAファイルハンドルから読み込む都度find_encodeingを読んでいないので高速。
#!/usr/bin/perl -w use strict; use warnings; use Encode; my $enc_eucjp = find_encoding('eucjp'); my $enc_utf8 = find_encoding('utf8'); while (<DATA>) { my $utf8 = $enc_eucjp->decode($_); # ... print $enc_utf8->encode($utf8); } exit; __END__ 日本語 テスト
入力のエンコードが既知(eucjp)の場合は問題ないが、各読み込みで入力のエンコードがわからない場合はその都度guess_encodingする。その場合は必ずエラーチェック。guess_encodingの戻り値がリファレンスになっていれば成功。ただの文字列なら失敗。
#!/usr/bin/perl -w use strict; use warnings; use Encode; use Encode::Guess; my $enc_eucjp = find_encoding('eucjp'); while (<DATA>) { my $enc = guess_encoding($_, qw/euc-jp shiftjis 7bit-jis/); my $utf8 = ''; if (!ref($enc)){ die "Can't guess: $enc"; } else { print 'guess: ', $enc->name; $utf8 = $enc->decode($_); } # ... print $enc_eucjp->encode($utf8); } exit; __END__ 日本語 テスト
utf8フラグとかどうするんだっけなぁ。。。