ishinao.net/mylog微妙にinvalidなRSSを手軽にvalidにする方法で、charsetが宣言と違うRSSが結構あるということが触れられていました。PerlでRSSをXML::Parserを利用してゴニョゴニョする(XML::RSSも含む)場合、このトラブルに加えて、Shift_JISやEUC-JPのエンコード・マッピング・ファイルが無いことが多いので、うまくゴニョゴニョできないことが多いですね。

僕はこんなコードで、この両方の問題をまとめて回避しています。

#!/usr/local/bin/perl

use strict;
use Jcode;
use LWP::Simple;
use XML::RSS;

my $res = LWP::Simple::get('http://example.com/path/to/rss');
my $content = Jcode->new($res)->utf8;
$content =~ s/<\?xml.*?\?>/<\?xml version="1.0" encoding="UTF-8"\?>/;
my $rss = new XML::RSS;
eval { $rss->parse($content); };
...
  1. ファイルごとUTF-8にコンバート
  2. encoding宣言をUTF-8に書き換える
  3. その後、パース

ということ。UTF-8に書き換えるところの処理がかなり適当。こうするとUTF-8で扱うことになるので、エンコード・マッピング・ファイルも必要ないです。

いろいろなアプローチがあると思いますが、ここらへんのことはある程度RSSリーダー側で処理してやった方が良いと、僕も思います。