2012-11-12

htmlspecialchars()とhtmlentities()の第4引数はfalseで

文字エンコーディングに 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);

0 件のコメント:

コメントを投稿

綺麗に見せることに全振りした操法大会の訓練を50日間するよりも、月1回でいいから基本的な操作方法の訓練を実施すべきだと思うのは俺だけか

 7月に県の消防操法大会がある。 市内分団の持ち回り制で、今年はうちの分団が出場する。 俺も前回回ってきたときに、選手として出た。 訓練が5月から始まっている。 週5日。 訓練時間は2時間だけど、その前に準備する時間もあり、訓練後の撤収時間も必要だから、拘束時間は約3時間。 俺が...