今天将php版本升级到5.3.0以上(我升级到php5.4.13)的版本后发现一个问题 htmlspecialchars 函数返回为空。
查了资料后,发现新版本对htmlspecialchars这个函数做了修改,当本地字符集不是utf-8的时候,需要默认指定当前使用的字符集,否则就可能会出现返回为空的情况。详情可参考这个文章 http://ouyangxiaofei914.blog.163.com/blog/static/13357443320117493932444/因为我的程序版本有可能工作在GBK或者utf-8两种环境下,所以得要兼容各种字符集,因此写了一个替换函数带代替htmlspecialchars带来的问题. 1 2 3 4 5 6 7 8 9 10 11 | /** * html字符串格式化(用于打印显示,替换掉html中的特殊字符) * @param string & $sHtml 需要处理的html * @return string * */ public function toHtmlChars( $sHtml ) { static $maEntities = array ( '&' => '&' , '<' => '<' , '>' => '>' , '\'' => ''' , '"' => '"' , "\n"=> '<br />' , ' ' => ' ' ); return strtr ( $sHtml , $maEntities ); } |
可以使用 toHtmlChars()这个函数来代替系统htmlspecialchars()函数
其中如果 【"\n"=>'', ' '=>' '】这个不用的话以去掉(这个只是为了让输出美观一点)。
参考文章2:
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 版本开始第三个参数字符串编码的默认值改成了 UTF-8,而我这段代码中的中文编码正好是 GB2312 编码的,跟现在的默认参数不一致,于是更改调用参数如下:
$str = '中文字符串' ; |
# 为了与旧环境兼容,这里第二个参数没有组合使用 PHP 5.4 新加入的 ENT_HTML401 常量 |
$str_converted = htmlspecialchars( $str , ENT_COMPAT , 'GB2312' ); |
echo $str_converted ; |
这样,“中文字符串”就可以正常显示了。为了使 PHP 5.4 之前环境中编写的代码能够向前兼容,建议调用 htmlspecialchars 函数的的时候都提供字符串编码参数