俺は文字コード関連に関しては正直「面倒くさい」ということ以外たいしてしらないのだが、JcodeとUnicode::Japaneseの根本的な差ってなんなんだろう?今のところCatalystで入ってきた文字列とかをUTF8に変換するのにJcodeを使っていたのだが、なんか「ペンギン」は文字化けしないのに「ペン」だと文字化けする現象に遭遇。よくわからんかったのでとりあえず他の書き方も試してみたらUnicode::Japaneseは動く、ということに気がついた。
じゃあ、と思ってこれを書いてみたんだけど、
use strict;
use Encode;
use Unicode::Japanese;
use Jcode;
my @words = qw(ペンギン ペン);
foreach my $w (@words) {
my $jcode_utf8 = Jcode->new($w)->utf8;
my $uj_utf8 = Unicode::Japanese->new($w)->utf8;
print "jcode is_utf8 ? ", Encode::is_utf8($jcode_utf8) ? "Y" : "N", "\n";
print "uj is_utf8 ? ", Encode::is_utf8($uj_utf8) ? "Y" : "N", "\n";
print "jcode eq uj ? ", $jcode_utf8 eq $uj_utf8 ? "Y" : "N", "\n";
print "jcode as hex = ", (map { my $p = unpack("H2", $_); "\\x$p" } ($jcode_utf8 =~ /(.)/g)), "\n";
print "uj as hex = ", (map { my $p = unpack("H2", $_); "\\x$p" } ($uj_utf8 =~ /(.)/g)), "\n";
print Unicode::Japanese->new($jcode_utf8)->euc, "\n";
print Jcode->new($uj_utf8)->euc, "\n";
}
結果はこんな感じ:
jcode is_utf8 ? N
uj is_utf8 ? N
jcode eq uj ? N
jcode as hex = \xe3\x83\x9a\xe3\x83\xb3\xe3\x82\xae\xe3\x83\xb3
uj as hex = \xa5\xda\xa5\xf3\xa5\xae\xa5\xf3
ペンギン
ペンギン
jcode is_utf8 ? N
uj is_utf8 ? N
jcode eq uj ? N
jcode as hex = \xe3\x83\x9a\xe3\x83\xb3
uj as hex = \xa5\xda\xa5\xf3
ペン
ペン
うーんうーん。別にどっちがどっちでもいいんだけど、この二つのモジュールはそもそも何が違うの?入力文字列が基本的にUTF-8、出力もUTF-8で、途中正規化やらなんやらで変換をかましたい時はどっちのモジュールを使う方がいいのだろう?
コメント