feedparserで文字コード判定がうまくいかない

初pythonプログラミングということで、feedparserを使ってTracのRSSを取得するようにしたいのだけど、Tracの吐くRSSの文字コード(エンコーディング)解析に失敗するときがある。

基本的にはUTF-8で出力しているのだけど、svnのチェンジセットやチケットの概要で日本語の長いコメントが入っていたりすると、RSSを出力するときに変な場所で文字を切ってしまうっぽい。

そうすると、UTF-8のRSS文書の中にUTF-8エンコードでは解析できない文字コードの並びが発生して、判別がうまくいかずに、「ISO8859-2/Latin2」なんて変なコードでencodeされてしまう。

feedparser.parse()で文字コードを強制的に指定できればいいんだろうけど、その方法は無さそう。一応、feedparserがどのような優先順で文字コード判別するかというドキュメントがあるのだけど、parseした後で認識した文字コードを変えられるんだろうか…。

ちなみに、UTF-8のRSSをLatin2と誤認識してしまうと、print する際にencode('shift_jis')では、エラーになる。なので、encode()のオプションに'ignore'や'replace'を付けてみるのだけど、

  • encode('shift_jis','ignore') → ASCII文字以外(漢字)が消える
  • encode('shift_jis','replace') → ASCII文字以外(漢字)部分が"??"で出力される

となってしまい、正しい文字が取れない…。本当はTrac側を修正してちゃんとしたRSSを出すようにすべきなのかもしれないけど、私が触れるものではないし、RSSの受け側でなんとか回避したいんだけどなぁ。

タイトルとURLをコピーしました