Jcode.pmには毎度お世話になりっぱなしだが、今日は
EUC-JPの文字列「GOOGLEニュース」(googleは全角大文字)がUTF8だと認識されるということに気づいた。
perl5.6での話なので5.8ではどうなるかわからない。
#!/usr/bin/perl
use strict;
use Jcode;
print getcode("GOOGLEニュース");
これをEUC-JPで保存して実行すると「utf8」だとでてくるはずです。
なぜかと調べると、JEncodeの作者のどんぞこ日誌さんのところにJcodeのコード判定方法について書いてありました。
ところでJcodeとEncode(Encode::Guess)の判定精度の違いですが、Jcode.pmではeuc,sjis,utf8それぞれで一番多くマッチしたものが判定結果になります。
なるほど。試しに、「GOOGLE」だけを判断させるとUTF8だと認識してしまうようだ。
短いテキストでも正しく文字コード変換するためには、なにかしらのチェックが必要だと
Naney's Diaryさんのエンコーディング変換精度向上を参考に以下の関数を書いてみた。
sub convert_to{
my ($in,$code) = @_;
$in = pack('C*',unpack('C*',$in));
foreach my $ccode ('utf8','euc','sjis','jis','ucs2','ascii') {
my $out = Jcode::convert($in, $code ,$ccode);
my $rev = Jcode::convert($out, $ccode, $code);
if ($in eq $rev) {
return $out;
}
}
return Jcode::convert($in, $code);
}
この関数で
my $ret = &convet_to($str,"euc|utf8|sjis|jis");
しばらくこれで行ってみよう。