Mar 25, 2005

PerlでEncode

ひさびさPerlでプログラム(RSSリーダー)作ってたら、ハマった〜!
Jcode.pmを使ってutf-8の文字列をsjisやeucに変換しようとしても、一向にうまくいかない。まったく変換が効いてない感じ。
一体なんだこれと思ってたら、どうやらPerl5.8から内部でUnicodeが使われている 関係上、Jcodeで変換したつもりでも変換がされてないみたい。Unicodeフラグがどうのこうのとかとか。。。(できればこういう問題はやりたい事の本質じゃないので、軽くすませたい。)
で、Perl5.8からはJcodeじゃなくてEncodeというモジュールが標準で入っているから これを使った方が良いみたい。

Encode - Perl5.8で標準となるJcode.pmの後継モジュール。

ココを参考にして
-----------------------------------------------------
use Encode;

$encoded = encode($enc, $string);
-----------------------------------------------------
でうまくいった。$encにはshiftjis, euc_jpなどが入る。

これでだいたいうまくいったかと思ったら、今度はEUC_JPで書かれたRSSの読み込みで エラーが出ててる。ちくしょー。サーバーのエラーログ見ると「Couldn't open encmap euc-jp.enc:No such file or directory」euc-jp.encが無いらしい。また別の問題。そのファイル、どっかネットに落ちてないかと検索すると、同じようなエラーにぶつかってる人がちらほら。皆同じページで解決している。
↓ココ
Perl XMLでencoding='Shift_JIS'や'euc-jp'を使う
で、これ見たら、単純にそのeuc-jp.encってファイルを配ってる訳じゃなくて、それを 生成するPerlスクリプトを配っている。つまり作業が必要。ちょっと気が遠くなった。
でも、実際には作業は簡単で、上から落としたmkenc.plを/usr/lib/perl5/site_perl/...../XML/Parser/Encoding/ に置いて、

> perl mvenc.pl x-euc-jp-unicode euc-jp

ってやるだけだった。
でも、実際にはXML::Parserモジュールが古かったらしくて、それでもエラーが出てたから、最新版をインストールしたり。
結局やりたいことの3倍くらい時間がかかった。
英語圏の人間だったらこんな事やらなくていいのにな〜。
あきらかに不利!!!
Posted at 04:20 in tech | WriteBacks (0) | Edit
Edit this entry...

wikieditish message: Ready to edit this entry.
















A quick preview will be rendered here when you click "Preview" button.