【PHP】htmlspecialcharsでの多重エンコード
事象
htmlspecialcharsで特殊文字を変換したとき、何度もhtmlspecialcharsを通すと意図しない形になった。
詳細
例:
【原文】
はちみつ&りんご
【1回目】
値 :はちみつ&りんご
画面表示:はちみつ&りんご
【2回目】
値 :はちみつ&りんご
画面表示:はちみつ&りんご
【3回目】
値 :はちみつ&りんご
画面表示:はちみつ&りんご
原因
1回目では「はちみつ&りんご」の&を変換。
2回目では、1回目で変換した「はちみつ&りんご」の&を変換。
3回目では2回目で変換した「はちみつ&りんご」の&を変換。
変換後の文字&も変換してしまうのでこのような現象が起きました。
解決方法
htmlspecialcharsの第四引数double_encodeに、falseを設定してあげます。 double_encodeをfalseにすると、既にあるhtml特殊文字はエンコードしなくなります。
参考サイト
PHP: htmlspecialchars - Manual
第四引数double_encodeでhtmlspecialcharsの二重エスケープ防止