原文

 

hp 5.4.0 发布之后,很多人会想着要升级尝试一下,我也是尝鲜者之一,不过在尝鲜之后,我被困扰了。

php 5.4.0 的改变有一些,但其中困扰我的是 它内置编码自 ISO-8859-1 改成了 UTF-8。

初看起来,这并没有什么,但是,htmlspecialchars和htmlentities函数,默认会使用utf-8来处理字符串。

如果输入的字符串是GBK编码,那么很抱歉, 返回的结果是空的, 输入的字符串被吃了。

在DZ里面,大量使用到了htmlspecialchars函数,升级php 5.4所面临的问题将是极具挑战性的。 你会发现哪儿哪儿都不正常。

痛定思痛,我在这里友情提醒大家,在这个问题没有解决之前,不要贸然升级。

目前官方没有解决方法,我们自己找到的解决方法有两个:

1、 改写我们自己的程序,将原来的 htmlspecialchars方法改写为
htmlspecialchars($string, NULL, 'GB2312');
2、 修改PHP 5.4的源码 ,打开ext/standard/html.c,转到 373行。
将 return cs_utf_8;
改为 return cs_gb2312;
重新编译php 5.4
改过之后,我们其实是把 php 5.4的默认编码改成了 gb2312

如果网站程序全部采用GBK编码,那么默认编码改成GB2312是比较好的,效率也更高一些。
但是如果GBK和UTF—8并存,那么就需要更改编码为 ISO-8859-1;
修改 return cs_utf_8;
为 return cs_8859_15;

这样PHP5.4就采用了原来php 5.3及以下的默认编码。
兼容性最好。

我提交给PHP的BUG反馈地址:
https://bugs.php.net/bug.php?id=61354
官方的讨论:
http://news.php.net/php.internals/58853