まとめると以下のようになる。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フラグとかどうするんだっけなぁ。。。