« Google ニュース日本語版開始 | メイン | 9月1日の某サーバの通信量グラフ »

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");

しばらくこれで行ってみよう。

トラックバック

この一覧は、次のエントリーを参照しています: Jcodeのエンコーディング判定:

» Unicode::Japanese from blog.nomadscafe.jp
BlogSurfで、Jcodeのエンコーディング判定で書いたconvert_to関数を使ったが見事玉砕 utf-8文字列からeucへの変換ができないことが多々。 Unicode::Japanese - 日本語文字コード変換 を使ってみることにした。 Jcodeは内部的にEUC-JPを使うのに対して、UTF-8を使う文字コ... [詳しくはこちら]