2006年02月07日(火) [過去の今日]
#3 Jcode.pm の 存在意義
もうEncodeが使えるようになって久しく、Jcode.pmはその歴史的役割を閉じた……と思い込んでたのだが、そうでもないらしい。
たとえば半角カナを全角カナに変換しようというとき、Jcode.pmでは、 こちらの投稿にあるように
$from = Jcode->new('0-9A-Za-z()#”','sjis')->euc; $to = '0-9A-Za-z()#"'; $str_e = Jcode->new($str,'sjis')->h2z->tr($from,$to)->euc;
というようなことが出来た。これをEncodeでやろうとしてもできるものではない。
で、そんなwrapperがあればいいのかなあ……と考えたとき、そういえばJcode.pmそのものがEncodeのwrapperとして再実装されてたのを思い出した。 そこで上記コードをその再実装版のJcode.pmで動かしてみたところ、見事に動いた。コードも簡潔で美しくなるし、何より開発者に優しい。
うーん、やはりJcode.pmは日本語を利用するperlユーザーには必須という状況なのであろうか。
(@687)
@ 参考までにEncode::JP::H2Zの使い方:
実はperldocにも使い方が書いてない。しかも色々注意事項があったりする割に、解説してるサイトがない。唯一 googleキャッシュで見付けた記述 があったので、引用しておく。
まず、utf8な変数は受け付けません。ので、utf8フラグが立っている場合は削っておく必要があります。encode等を使って、euc-jpのオクテット列に変換し、渡す事になります。 (中略)
use Encode; use Encode::JP::H2Z; if(Encode::is_utf8($string)){ $string = encode('euc-jp', $string); Encode::JP::H2Z::h2z(\$string); $string = decode('euc-jp', $string); } else{ Encode::JP::H2Z::h2z(\$string); }
ポイントはeuc-jpに変換し、リファレンスで渡してやることか。
(@699)
@ 手元のコード:
今やってるのはShift_JISの半角文字の入った(でっかい)テキストファイルを読み込み、半角カナはすべて全角ひらがなに変換しようという試み。
まず、Encodeだけでやった場合。
use Encode qw/encode decode from_to/; from_to($data, 'shiftjis','euc-jp'); Encode::JP::H2Z::h2z(\$data); $data = decode('euc-jp', $data); $data =~ tr/ア-ン/あ-ん/; print encode('euc-jp', $data);
速度は、
real 0m11.840s user 0m10.090s sys 0m1.310s
こんなもん。
次に、Jcode.pmを使った場合。
use Jcode; my $from = Jcode->new('ア-ン','sjis')->euc; my $to = 'あ-ん'; my $str_e = Jcode->new($data,'sjis')->h2z->tr($from,$to)->euc; print $str_e;
速度は、
real 0m11.876s user 0m10.210s sys 0m1.160s
実質的に違い無し。
んー、これがもともとオブジェクト指向の言語であれば、Encodeのような実装でも同じStringクラス配下になって、Jcode.pmのように使えるのかねえ。
ちなみにテストに使ったテキストファイルは12MくらいのShift_JIS。CPUはAthlon64 3000+で、OSはDebian GNU/Linux(sid)のi386版。
(@709)