XMLの出力でhtmlentitiesは使うな!

XMLの出力でhtmlentitiesは使うな!

phpを使用して、rss(xml)の出力をすることがありまして、
いろいろいじっていたのですが

そこで出てくるのがやはり文字のエスケープ問題。
XMLにはHTML特殊文字を書くことができません。

それらをxml上にそのまま書いたら最後、フィードエラーとなり、
外部サービスのRSSリーダーなどで正常に読み込めなくなります。

phpでHTMLエスケープするなら、当然候補にあがるのが

htmlspecialcharas
htmlentities

これらPHPのエスケープ関数です。

この2つの違いがいっつもわからなくなるのでメモっておきますが

htmlspecialcharasが 「",<,>,&」をエスケープしてくれるのに対し
htmlentitiesはそれらHTMLの特殊文字に加えて更に多くの文字(半角カタカナ文字など、、)をエスケープしてくれます。

「じゃあhtmlentitiesだけ覚えておけば間違いないじゃないか」

と思った過去の私がいけなかった。。。

ことXMLに形成して出力するに関しては

「htmlentitiesは、XMLにとってしなくていい余計なエスケープをしてくれちゃう」

ということです。
これによって、フィードがエラーを起こし、不具合が生じる可能性があります。
例えばブログのrss出力なんて場合、使いそうもない文字を使ってることが結構あるんですよね、、
文字による装飾のために。その使いそうもない文字をエスケープしちゃうもんだから話がこじれる。

しかも厄介なことに、最近のChromeブラウザなどは
エラーがあるxmlを直接読みに行っても、エラーを返してくれないということがあり、
気づいた時には時既に遅し、、なんてことも考えられます。

こんなときは、プログラマーにつねに厳しい「ie」で確認しましょう。
エラーで見れない旨を一発で返してくれます。20160307現在

ちょとずれましたが、とにかくphpでXMLを形成する際は
htmlspecialcharasでおとなしくHTML特殊文字のみを変換しましょう!ということでした。

以上です。