$content = $j->set(\$content)->utf8;
$content =~ s/<\?xml.*?\?>/<\?xml version="1.0" encoding="UTF-8"\?>/;

というような感じで、まず、ファイルごとUTF-8に変換し、文字コード判定ミスの可能性を減らし、次に、XML::RSSでのXML宣言における文字コードと実際の文字コードが違うという理由で起こるパースエラーを、XML宣言を書き換えることによって回避してみる。

力業・・・確かに力業なんですが、他になかなか良い方法が思いつかない。

最初は、XML::RSSでparseした後、再帰的にオブジェクトを辿りつつ、UTF-8に変換しようと思ったんですが、短い文字列ごとに変換するので、意味なかったです。

まぁ、この方法を利用すると、Shift_JISやEUC-JPなRSSファイルを、それぞれのエンコードマッピングファイルを用意する必要無しにXML::Parserにかけられるので、便利といえば便利。