XML1.0にvalidな文字列の出力

RSSパーサーを使っていて、たまに外部のblogサービス*1RSSが変な文字を含んでいてパースできないことがあるので、XMLの仕様を再確認してみた。


許可されるのはC0制御文字集合(0x00〜0x1f)のう水平タブ=HT(0x09), 改行=LF(0x0a), 復帰=CR(0x0d)とC1制御文字集合(0x80〜0x9f)、あと削除=DEL(0x7f)。


ただしXML1.1ではC1制御文字集合のうち0x85以外*2はinvalidに。


0x00と改行文字以外の制御文字(0x01〜0x08, 0x0b〜0x0c, 0x0e〜0x1f, 0x7f〜0x84, 0x86〜0x9f)は文字参照*3として記述可能




自前で出力してるコードで同様のケースがないようにXML1.0としてinvalidな制御文字を除去するPHPコード。

mb_regex_encoding('UTF-8');
$str = mb_ereg_replace('[\x00-\x08\x0b\x0c\x0e-\x1f]', '', $str);

今回参考にしたサイトのURL

*1:seesaaRSSに含まてれるケースがよくある(tinymceのせい?)

*2:0x85は改行文字に追加(メインフレームの改行文字NEL)

*3:例:&#99