Jcodeのエンコーディング判定
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");
しばらくこれで行ってみよう。