狐の王国


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)

この記事のURI

最近の記事

以上、1 日分

タイトル一覧


カテゴリ分類
Powered by hns-2.19.8, HyperNikkiSystem Project

過去にこの日記が置いてあったcgi.misao.gr.jpは廃止されました。それによって記事へのURIが変わってしまっています。cgi.misao.gr.jpをwww.misao.gr.jpと置き換えるだけで同じ記事にアクセスできるはずです。

Sugano "狐志庵" Yoshihisa(E) @ 美紗緒ネットワーク <koshian@misao.gr.jp>
日記管理ページ