質問: phpには、フォームに入力された悪意あるjavascriptやhtml要素を無毒化してくれる`htmlspecialchars()`があります。 特殊な文字の機能を別の文字に置き換えてくれるエスケープを行うさい、引数に指定した値によってエスケープできる文字列が変わります。 ENT_CONBATが、変数展開ができるダブルクォートは、変換しないがシングルクォートは変換する。ENT_QUOTESが両方とも変換し、ENT_NOQUOTESが変換しません。 PHPマニュアルというサイトを拝見するとこの三つ以外にも`ENT_IGNORE、ENT_SUBSTITUTE、ENT_DISALLOWED、ENT_HTML401、ENT_XML1、ENT_XHTML、ENT_HTML5`があります。 ただ読解力が無いのか、提示した八つの定数のうち`ENT_IGNORE、ENT_SUBSTITUTE、ENT_DISALLOWED`は、マニュアルに書いてあることが全く理解できませんでした。 特に頭を悩ませた単語が、無効な符号単位シーケンス(文字コード?)、指定した文書型(DOCTYPE?)、符号位置です。噛み砕いて説明していただくとどうなりますか。 残りの`ENT_HTML401、ENT_XML1、ENT_XHTML、ENT_HTML5`は、htmlspecialcahrsで受け取った値をENT_のあとに続く文字として扱うと書いてありました。 html5やファイルの書き方の規則の一つであるXMLなどは、理解できますが値をそれらとして扱うというのは、具体的にどういうことなのでしょうか。
回答: Latin-1のような1バイトコードは別として、UTF-8のような複数バイトから生成される文字コードの場合、でたらめに並べたバイト列が正しく文字とならないことがあります。そのような文字が現れた場合、 * `ENT_IGNORE`...無効な文字を取り除いてしまう * `ENT_SUBSTITUTE`...U+FFFD(�)に置き換える * `ENT_DISALLOWED`...U+FFFD(�)に置き換える(Unicode領域にあっても不適当な文字まで置き換え) * 無指定...失敗して空文字列を返す Unicodeのコードポイントにあっても、たとえばHTML5には文字として使えない領域があるので、そういうのを弾くか弾かないかが`ENT_SUBSTITUTE`と`ENT_DISALLOWED`の違いです。 アポストロフィ1つに対して、HTML 4.01以外では`'`が存在するのでそれを使いますが、HTML 4.01ではないので`'`と数値参照にします。`htmlentities`ではもう少し違いが出るかもしれませんが、`htmlspecialchars`ではこれだけです。 ...これを書くために調べていたら、mpywさんがQiitaに投げたものがみごとにヒットしました。