多分文字コードの問題だと思う。ただの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が返ってこなくなる。バグってるときもしょっちゅうあるが、ちゃんと書いていても返らないことがときどきある。
とりあえずこのソースで一度は動いた。もう気が狂いそうなので今日はここまで。朝飯にする。