php5.4以上版本GBK编码下htmlspecialchars输出为空问题解决方法汇总


Posted in PHP onApril 03, 2015

从旧版升级到php5.4,恐怕最麻烦的就是htmlspecialchars这个问题了!当然,htmlentities也会受影响,不过,对于中文站来说一般用htmlspecialchars比较常见,htmlentities非常少用到。

可能老外认为网页普遍应该是utf-8编码的,于是苦了那些用GB2312,GBK编码的中文站......!

具体表现:

$str = "9enjoy.com的php版本是5.2.10";

echo htmlspecialchars($str);

gbk字符集下输出为空...utf-8下,输出正常。

为什么呢,原因在于5.4.0对这个函数的变化:

5.4.0   The default value for the encoding parameter was changed to UTF-8.

原来是什么呢?
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.

原来是ISO-8859-1,5.4后默认变成utf-8!然后中文使用这个函数就输出为空白了。

国内一堆开源程序在5.4下都会有这样的问题,DISCUZ官方也建议用户不要升级到5.4

解决方案:

1.苦逼的修改所有用到htmlspecialchars地方的程序

1.1 其第二个$flags参数,默认是ENT_COMPAT,因此改成

htmlspecialchars($str,ENT_COMPAT,'GB2312');

为什么不是GBK?因为没有GBK这个参数,如果强行使用GBK,则报错给你看:
Warning: htmlspecialchars(): charset `gbk' not supported, assuming utf-8

为了能使用GBK,则改成:
htmlspecialchars($str,ENT_COMPAT,'ISO-8859-1');

1.2.一样是改程序,但可以省略一个参数。
可以在网页头部加
ini_set('default_charset','gbk');

然后改成
htmlspecialchars($str,ENT_COMPAT,'');

文档中有写:An empty string activates detection from script encoding (Zend multibyte), default_charset and current locale (see nl_langinfo() and setlocale()), in this order. Not recommended.
大概意思就是:传入空字符串则使用default_charset的编码

1.3.封装一个函数吧...本来htmlspecialchars这个单词一直不好记。

function htmlout($str) {

    return htmlspecialchars($str,ENT_COMPAT,'ISO-8859-1');

}

然后去批量替换。

2.直接修改源码,重编译!这也是目前我在线上做的方案。
修改ext/standard/html.c
大概在372行

/* 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;

编译后,原程序就不用做任何调整了。
安装方法可参考:https://3water.com/article/63388.htm

windows下怎么办?这个,自己想办法编译吧,难度比较大...
提供一个网址供参考:https://3water.com/article/63391.htm
引用其一句话:准备好咖啡、可乐,做好准备,可能要折腾数小时…

PHP 相关文章推荐
PHP4实际应用经验篇(4)
Oct 09 PHP
PHP array_multisort()函数的使用札记
Jul 03 PHP
无需重新编译php加入ftp扩展的解决方法
Feb 07 PHP
深入php处理整数函数的详解
Jun 09 PHP
利用curl抓取远程页面内容的示例代码
Jul 23 PHP
PHP微信开发用Cache 解决数据缓存
Jul 11 PHP
php+mysql查询实现无限下级分类树输出示例
Oct 03 PHP
Yii2中使用asset压缩js,css文件的方法
Nov 24 PHP
WHOOPS PHP调试库的使用
Sep 29 PHP
PHP自动生成缩略图函数的源码示例
Mar 18 PHP
laravel 关联关系遍历数组的例子
Oct 10 PHP
ThinkPHP5.0框架实现切换数据库的方法分析
Oct 30 PHP
Windows下编译PHP5.4和xdebug全记录
Apr 03 #PHP
Centos下升级php5.2到php5.4全记录(编译安装)
Apr 03 #PHP
php实现在限定区域里自动调整字体大小的类实例
Apr 02 #PHP
php实现专业获取网站SEO信息类实例
Apr 02 #PHP
php获得网站访问统计信息类Compete API用法实例
Apr 02 #PHP
php实现从上传文件创建缩略图的方法
Apr 02 #PHP
php调用KyotoTycoon简单实例
Apr 02 #PHP
You might like
用PHP+MySql编写聊天室
2006/10/09 PHP
修改apache配置文件去除thinkphp url中的index.php
2014/01/17 PHP
php对数组内元素进行随机调换的方法
2015/05/12 PHP
php检查页面是否被百度收录
2015/10/28 PHP
很可爱的输入框
2008/08/03 Javascript
javascript轻松实现当鼠标移开时已弹出子菜单自动消失
2013/12/29 Javascript
javascript判断是手机还是电脑访问网页的简单实例分享
2014/06/03 Javascript
js面向对象编程之如何实现方法重载
2014/07/02 Javascript
吐槽一下我所了解的Node.js
2014/10/08 Javascript
初始Nodejs
2014/11/08 NodeJs
javascript中sort()的用法实例分析
2015/01/30 Javascript
EasyUI Combobox设置默认值 获取text的方法
2016/11/28 Javascript
canvas实现绘制吃豆鱼效果
2017/01/12 Javascript
js常用DOM方法详解
2017/02/04 Javascript
js合并两个数组生成合并后的key:value数组
2018/05/09 Javascript
在vue中使用vuex,修改state的值示例
2019/11/08 Javascript
[02:19]DOTA2女子战队FOX视频专访:希望更多美眉一起加入
2013/10/15 DOTA
[01:15:18]2014 DOTA2国际邀请赛中国区预选赛 LGD VS Speed Gaming.cn
2014/05/22 DOTA
Django 生成登陆验证码代码分享
2017/12/12 Python
Python实现连接postgresql数据库的方法分析
2017/12/27 Python
pandas数据处理基础之筛选指定行或者指定列的数据
2018/05/03 Python
使用Python-OpenCV向图片添加噪声的实现(高斯噪声、椒盐噪声)
2019/05/28 Python
在Python中表示一个对象的方法
2019/06/25 Python
python字符串中匹配数字的正则表达式
2019/07/03 Python
Pytorch 实现冻结指定卷积层的参数
2020/01/06 Python
香港化妆品经销商:我的公主
2016/08/05 全球购物
微软香港官网及网上商店:Microsoft HK
2016/09/01 全球购物
主管会计岗位职责
2014/03/13 职场文书
车队司机个人自我鉴定
2014/04/17 职场文书
2015年元旦演讲稿
2014/09/12 职场文书
企业授权委托书范本
2014/09/22 职场文书
2014年纪检监察工作总结
2014/11/11 职场文书
追悼会家属答谢词
2015/09/29 职场文书
pygame面向对象的飞行小鸟实现(Flappy bird)
2021/04/01 Python
JS如何使用剪贴板操作Clipboard API
2021/05/17 Javascript
MySQL 原理与优化之Limit 查询优化
2022/08/14 MySQL