RSSがエラーになる

たとえばこんなの:

XML Parsing Error: undefined entity
Location: http://d.hatena.ne.jp/contractio/rss
Line Number 222, Column 86: <description> -原文:Im Laufe der menschlichen Entwicklung steigt die soziale Komplexit&auml;t, das hei&szlig;t die ...</description>

XML では HTML にあるウムラウトとかの実体が定義されてませんのでエラーになります。なんとかして欲しいっす。対処方法としては、二通り:

  • 実体をユニコード文字に展開して RSSUTF-8 で配信
  • RSS 内に DTD の内部サブセットを作って、そこに HTML の実体定義を全部書いておく

前者が無難。最近の Perl ならなんとかなるっしょ。後者の方が実装は楽そうだけど HTML の実体っていっぱいあるから RSS のサイズがでかくなってマズー。ちなみに XML 1.0 の仕様では「non-validating perser は DTD の外部サブセットや外部パラメタ実体を読まなくてよい」ということになっているので、それらの実体定義を別ファイルに切り離すことはできません。

あ、他にも、

  • 実体はてきとーな文字(?とか)に置き換えちゃう
  • & を全部 &amp; に置き換えちゃう

って手もあるか。後者の方が無難。正しい対処ではないけどエラーで全然読めないよりはマシだし。これなら 1 行追加で対応できそうなので是非やって欲しいです。

以上はてなダイアリーへの要望ということで。よろしくお願いします>id:hatenadiaryさん。

(追記)

XMLは「国際対応」遅れてるの? んー?

いや、ウムラウトとかそのへんの文字は XML では

ということです。HTML のそのへんの文字を表す実体は全部この形に変換できるので、文字の表現力で HTML に劣るというわけではありません*1

ああ、それで思い出した。対処法にはもう一つ

というのがあります。正しい対処法の中ではこれが一番簡単かな。ユニコード非対応のスクリプト言語(古いバージョンの Perl とか)でも対応できるし*2

(追記2) 悪徳商法?マニアックスRSS(悪の最新情報) も同じ問題を抱えていることが判明。&nbsp; でエラー。


*1:XHTML だと DTD で実体定義してます(Latin-1, Special)

*2:はてなの場合は既に UTF-8 で配信できてるようなので一番最初に挙げた方法でも手間は一緒ですが。