文字エンコーディングに UTF-8 を使っているときは気にしなかったが、 EUC-JP や Shift_JIS を使わなければならなかったとき、ハマッた。 EUC-JP や Shift_JIS (両方とも、Windows標準キャラクタセットが扱える CP51932、SJIS-win を含む)の場合、これらの文字セットに存在しない ⓒ などをPOSTすると、数値文字参照形式でPOSTされる。 なので、POSTされた値を htmlspecialchars() や htmlentities() を通して echo htmlspecialchars(POST値, ENT_QUOTES, 文字エンコーディング); echo htmlentities(POST値, ENT_QUOTES, 文字エンコーディング); とすると、数値文字参照の「&」が「&」に変換され、数値文字参照の値がそのまま表示される。 これは、両関数の第4引数「double_encode」のデフォルトが「true」のため。 ■PHPマニュアル htmlspecialchars() http://www.php.net/manual/ja/function.htmlspecialchars.php ■PHPマニュアル htmlentities() http://www.php.net/manual/ja/function.htmlentities.php 回避策は、この第4引数「double_encode」を「false」にしてやればいい。 こんな感じ。 echo htmlspecialchars(POST値, ENT_QUOTES, 文字エンコーディング, false); echo htmlentities(POST値, ENT_QUOTES, 文字エンコーディング, false);