人気ブログランキング | 話題のタグを見る

[Perl] perl5.8 の文字コードにハマる

お約束です(笑)
perl5.8 をやったら、必ずと言ってよいほど、
文字コード周りで一度はハマるでしょう。
抜けるのに2日弱かかってしまいましたよ。

perl は 5.8 から、文字コード周りの扱いががっつり変わりました。
5.6 時代のものなんて、そのままでは上手く動くかどうかわかりません。
まして 5.005 とか、jperl なんてのは、更に怪しいです。

どう変わったかと言うと、UNICODE の扱いが正しく実装されました。
まぁ、私たちのような多バイト文字圏のユーザには、
しち面倒くさい設定が必要になるという意味です。
そのため、入出力ストリームの文字コードを指定してやる必要があります。
Java みたいっすねぇ。
Java でもこのあたりは相当悩まされましたが。
ノウハウが溜まって慣れれてしまえば、全く問題ではないのですけれど、
自分なりのノウハウを溜めるまでが、試行錯誤なんですよねぇ。

作りたいものは、RSS の解析&データベースへの投入なので、
1日で終わると高を括っていたら、エライ目に遭いました(^^;;
実際、多分 perl5.6 だったら、半日もせずに終わったでしょうけれど…。

RSS のパージングは簡単です。
最初 XML::DOM を使おうと思っていたのですが、
XML::RSS というのがあるそうなので、そっちを使うことにしました。
apt でもインストールできましたし(libxml-rss-perl)、
ツリー構造なので、直感的な操作ができます。
1 use XML::RSS ;
2 my $rss = new XML::RSS ;
3 $rss->parsefile($file) ;
4 my $title = $rss->{items}->[0]->{title} ;

これで、最初の item のタイトルが得られます。
まぁ簡単(^-^)

因みに、一昨年 C で XML のパージングをした時には Xerces を使いました。
これ「ザーシズ」と読むのですが、
どうしてもヘンデルのオペラが先に浮かんでしまい、
「クセルクセス」とか「セルセ」と読んでしまいます。
キャスリーン・バトルのソロで有名になった「オンブラマイフ」のオペラです。
いまだに、あれ?読みはどれだっけ?と、混乱しています(>_<)

で、パージングの後、得られたデータをDBに投入します。
DBとの通信はモジュールを使って行いますが、
RSS は utf-8 なので、
DBに投入する文字列を euc-jp に変換する必要があります。
XML::RSS は内部で XML::Parser を使用しているので、
得られた文字列には、すべて utf8 フラグが立っているらしいです。
なんスか、utf8 フラグって(笑)

さて、変換の仕方。
ソースファイルを utf-8 で作成します。
1 use utf8;
2 use Encode qw/encode/ ;
3 use open IO => ":encoding(euc-jp)";
4
5 $query = "select * from テーブルA where タイトル='$title' " ;
6 $query = Encode::encode("euc-jp",$query) ;
7 $res = $DB->exec($query);

DB クラスの中で、DB とソケット通信をしています。
そのため、ソチラの OUT ストリームも euc-jp でぇすと指定する必要があり、
3 行目の指定が必要になります。
3 行目の代わりに、
binmode STDOUT, ':encoding(euc-jp)';

と指定しても良いのですが、
今実行している関数と DB クラスはスコープが違うので、
これだと、DB クラスまでその指定が適用されず、euc-jp になりません。
使用しているクラスで出力する操作がない場合は、
binmode でも、ちゃんと euc-jp になっていました。

しかし、たった数行に2日とは、
なんと単価の高いプログラムであることよ(;´д⊂
ま、ハマるというのは、往々にして、そういうものですし。
どうせ、今月でこの会社を引き払うので、
大仕事がもらえなくてヒマしていましたから、良いんですけれどね。

この辺のページが、かなり参考になりました。
ありがたや、ありがたや(-人-)
utf8 フラグについても、手取り足取り腰取り、記述されています。
NDO::Weblog::Elephant NDO::Weblog の Perl カテゴリ
Perl 5.8.x Unicode関連
Perl-5.8 覚え書き
by xiaoxia | 2005-03-15 18:13 | プログラム言語
<< TV録画した動画を見る edィタ >>