■2004-01-18 コードの判定
* [Perl] Encodeの判定方法
さらにJEncodeのコード判定を直しました。ところでJcodeとEncode(Encode::Guess)の判定精度の違いですが、Jcode.pmではeuc,sjis,utf8それぞれで一番多くマッチしたものが判定結果になります。これに対してEncode::Guessでは指定した文字コードでdecodeできないものを篩にかけていきます。そのため、複数のコードでdecodeできてしまうと'shiftjis or euc-jp'や'euc-jp or utf8'などになってしまうわけです。今回はsjisかeucかわからない場合だけ、その文字列をeucと仮定してdecodeし、日本語にマッチするかチェックするようにしました。これで相当判定精度が高まっています。が、いわゆる半角カナなどの文字に対しては、失敗する場合がありますので、要修正です。
→最新版ではだいぶ補助判定方法が変更されています(2004-04-12)
* [Perl] Perlの正規表現
ちなみにperl5.8以降(一応5.6も)では
$str = decode("euc-jp", $original); # utf8化 $str =~ m/(?: \p{InHiragana} | # 平仮名 \p{InKatakana} | # カタカナ \p{InCJKUnifiedIdeographs} | # 漢字 \p{InCJKSymbolsAndPunctuation} | # 全角記号 \p{InHalfwidthAndFullwidthForms} | # 半角カナ等 )/x;
とできます(参考:perl5.8のUnicodeサポート)。JEncodeはこれを使って補助判定しています。
追記:こういうのもあります(2004-04-12)
\p{InArrows} # 矢印 \p{InGeneralPunctuation} # 一般句読点 \p{InBoxDrawing} # 罫線
っていうか、こんな感じになりました。(2004-04-16)
ところでJcodeとEncode(Encode::Guess)の判定精度の違い
Jcode.pmには毎度お世話になりっぱなしだが、今日は EUC-JPの文字列「GOOGLEニュース」(googleは全角大文字)がUTF8だと認識されるということに気づいた。 perl5.6での話なので5.8ではどうなるかわからない。 #!/usr/bin/perl use strict; use Jcode; print getcode("..