最近把PHP版本从5.2.6升级到了5.5.10,升级后发现,程序中凡是使用htmlspecialchars函数的地方,htmlspecialchars都把字符串转换成空白字符,起初以为是新环境配置问题,以为是不支持htmlspecialchars函数。后来经过分析,发现不是。
官方说法:
5.4.0 The default value for the encoding parameter was changed to UTF-8.
哦,原来如此。
实际上,htmlentities也会受影响,这也就苦了使用GBK编码的开源CMS和论坛了,
所以,很多国内开源的系统,不建议用户升级到5.4以上版本。
那遇到这个问题怎么办呢。
方案一、修改程序,把所有使用到htmlspecialchars的地方都改掉。
方案二、看一下这个函数:
string htmlspecialchars ( string $string [, int $flags = ENT_COMPAT | ENT_HTML401 [, string $encoding = 'UTF-8' [, bool $double_encode = true ]]] ) Defines encoding used in conversion. If omitted, the default value for this argument is ISO-8859-1 in versions of PHP prior to 5.4.0, and UTF-8 from PHP 5.4.0 onwards.
有第二个参数,那就用试试。
htmlspecialchars($str,ENT_COMPAT,'GB2312');
不能使用GBK,因为:
Warning: htmlspecialchars(): charset `gbk' not supported, assuming utf-8
如果要是红GBK,可以:
htmlspecialchars($str,ENT_COMPAT,'ISO-8859-1');
也可以自己写个自定义函数:
function htmlout($str) { return htmlspecialchars($str,ENT_COMPAT,'ISO-8859-1'); }
自己定义的函数好拼写。在一些非智能提示的开发工具中,自己写的函数好记。
方案三、修改PHP的源程序,自己重新编译,这个玩法也不是不可以
修改ext/standard/html.c
/* Default is now UTF-8 */ if (charset_hint == NULL) return cs_utf_8;
把cs_utf_8改成 cs_8859_1
/* Default is now UTF-8 */ if (charset_hint == NULL) return cs_8859_1;
编译一下,就好了