XML1.0にvalidな文字列の出力
RSSパーサーを使っていて、たまに外部のblogサービス*1のRSSが変な文字を含んでいてパースできないことがあるので、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);