多分文字コードの問題だと思う。ただのhtmlなら、そのまま直接日本語を書けば表示されるが、rssフィードはxmlであり、このとき日本語はutf-8でないとダメなようなのである。・・・と、ここまで書いて、わかった。スクリプトはeuc-jpで保存する。
さて、それでとりあえずリテラル文字列なら日本語が書けたのだが、ファイルを読み込んでその中の日本語を出力できない。Jcodeで変換させるだけでエラーになる。文字コードの指定が間違っているのか。sjis -> utf-8 だと思うのだが。念のためにeuc-jp -> utf-8なども試してみたがダメだ。
#!/usr/bin/perl -w use strict; use CGI::Carp qw(fatalsToBrowser); use XML::RSS; my $rss = new XML::RSS (version => '1.0'); $rss->channel( title => "example.com", link => 'http://example.com', language => 'ja', description => "abc", ); open SUBBACK, "<./subback.txt" or die; while (<SUBBACK>){ if(/(\d*),(.*),(\d*)/){ $rss->add_item( title => "$1", link => "http://example.com/cgi-bin/main.cgi", description => "$3", ); } } close SUBBACK; print "Content-type: application/xml\n\n"; print $rss->as_string;
- perl(cgi)スクリプトの文字コード
- use encodingの文字コード
が一致していないときに、リテラルで日本語を書くとエラーになる。
とりあえずエラーは出なくなった。
化けてはいるが。
#!/usr/bin/perl -w use strict; use XML::RSS; use encoding 'utf8'; use Jcode; my $rss = new XML::RSS (version => '1.0'); $rss->channel( title => "example.com", link => 'http://example.com', language => 'ja', description => "abc", ); open SUBBACK, "<./subback.txt" or die; while (<SUBBACK>){ if(/(\d*),(.*),(\d*)/){ my $jp = $2; Jcode::convert( \$jp , 'utf8', 'sjis'); $rss->add_item( title => "$jp", link => "http://example.com/cgi-bin/bbz/main.cgi", # description => "南無阿弥陀仏", description => "test", ); } } close SUBBACK; print "Content-type: application/xml\n\n"; print Jcode->;new($rss->as_string)->;utf8;
ファイルを保存するときの文字コードと、use encodingが一致しないとエラーになる。ただしそれは日本語リテラルを書いた場合。(ファイルから読んだ場合も同じか?)
読み込んでいるタイトル一覧ファイルのエンコードはsjisなのは間違いない。だからそれをutf8に変換しているのだが・・・化ける・・・。コードの指定をあれこれ変えたりしてもダメ・・・。
そんなことをしていると、ときどきcgiが返ってこなくなる。バグってるときもしょっちゅうあるが、ちゃんと書いていても返らないことがときどきある。
とりあえずこのソースで一度は動いた。もう気が狂いそうなので今日はここまで。朝飯にする。