htmlspecialcharsは後方互換性があり、smartyにもこの問題があります.

1413 ワード

PHP 5.4.3環境では、PHP 5.2環境で正常に動作するプログラムをテストしたが、中国語の文字列をデータベースに正常に提出すべきコードが空の文字列を提出していることが分かった.調べたところ、この文字列はhtmlspecialchars関数によってエスケープされる前に正常だったが、エスケープされた後に空の文字列になった.呼び出しの例は次のとおりです.
$str = ' ';
$str_converted = htmlspecialchars($str);
echo $str_converted;

PHPマニュアルを見て、htmlspecialchars関数の原型は以下の通りであることを知りました.
string htmlspecialchars ( string $string [, int $flags = ENT_COMPAT | ENT_HTML401 [, string $encoding = 'UTF-8' [, bool $double_encode = true ]]] )

更新ログには、
5.4.0 The default value for the encoding parameter was changed to UTF-8. 
5.4.0 The constants ENT_SUBSTITUTE, ENT_DISALLOWED, ENT_HTML401, ENT_XML1, ENT_XHTML and ENT_HTML5 were added.

PHPは5.4.0バージョンから3番目のパラメータ文字列符号化のデフォルト値をUTF-8に変更しましたが、私のこのコードの中国語符号化はちょうどGB 2312符号化で、現在のデフォルトパラメータと一致しません.そこで、呼び出しパラメータを変更しました.
#古い環境との互換性のため、ここで2番目のパラメータはPHP 5.4を組み合わせて新しく追加したENT_を使用していません.HTML 401定数
$str = ' ';
$str_converted = htmlspecialchars($str, ENT_COMPAT ,'GB2312');
echo $str_converted;

これにより、「中国語文字列」が正常に表示されます.PHP 5.4以前の環境で作成したコードを前向きに互換性を持たせるために、htmlspecialchars関数を呼び出すときに文字列符号化パラメータを提供することをお勧めします.
ps:以上の問題はSmarty 2.6バージョンにもありますが、phpバージョン5.4以上ではエラーが発生します.smartyをアップグレードできない場合は、手動で変更します.
smarty/plugins/shared.escape_special_chars.phpの
$string = htmlspecialchars($string);