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 相关文章推荐
建立文件交换功能的脚本(三)
Oct 09 PHP
php自动注册登录验证机制实现代码
Dec 20 PHP
php preg_filter执行一个正则表达式搜索和替换
Feb 27 PHP
php实现上传图片文件代码
Jul 19 PHP
Laravel Memcached缓存驱动的配置与应用方法分析
Oct 08 PHP
php基于curl实现的股票信息查询类实例
Nov 11 PHP
PHP下 Mongodb 连接远程数据库的实例代码
Aug 30 PHP
PHP+AJAX 投票器功能
Nov 11 PHP
yii2中关于加密解密的那些事儿
Jun 12 PHP
实例讲解PHP表单处理
Feb 15 PHP
laravel 5.3 单用户登录简单实现方法
Oct 14 PHP
laravel 创建命令行命令的图文教程
Oct 23 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
laravel5.5添加echarts实现画图功能的方法
2019/10/09 PHP
php使用gearman进行任务分发操作实例详解
2020/02/26 PHP
简单的php购物车代码
2020/06/05 PHP
用JavaScript和注册表脚本实现右键收藏Web页选中文本
2007/01/28 Javascript
js 禁用浏览器的后退功能的简单方法
2008/12/10 Javascript
jQueryUI的Dialog的简单封装
2010/06/07 Javascript
用js解决数字不能换行问题
2010/08/10 Javascript
jquery 如何动态添加、删除class样式方法介绍
2012/11/07 Javascript
Javascript 多浏览器兼容总结(实战经验)
2013/10/30 Javascript
javascript中parentNode,childNodes,children的应用详解
2013/12/17 Javascript
jquery中$(#form :input)与$(#form input)的区别
2014/08/18 Javascript
Angularjs整合微信UI(weui)
2016/03/15 Javascript
浅析angularJS中的ui-router和ng-grid模块
2016/05/20 Javascript
超实用的javascript时间处理总结
2016/08/16 Javascript
详解Vue 实例中的生命周期钩子
2017/03/21 Javascript
微信小程序实现给嵌套template模板传递数据的方式总结
2017/12/18 Javascript
Node.js爬取豆瓣数据实例分析
2018/03/05 Javascript
JS二级菜单不同实现方法分析【4种方法】
2018/12/21 Javascript
[06:38]DOTA2怒掀电竞风暴 2013Chinajoy
2013/07/27 DOTA
Python2.x中str与unicode相关问题的解决方法
2015/03/30 Python
python复制与引用用法分析
2015/04/08 Python
python协程用法实例分析
2015/06/04 Python
Python中int()函数的用法浅析
2017/10/17 Python
PyCharm+Qt Designer+PyUIC安装配置教程详解
2019/06/13 Python
python列表插入append(), extend(), insert()用法详解
2019/09/14 Python
pytorch中tensor.expand()和tensor.expand_as()函数详解
2019/12/27 Python
给Django Admin添加验证码和多次登录尝试限制的实现
2020/07/26 Python
Python爬虫回测股票的实例讲解
2021/01/22 Python
CSS3绘制六边形的简单实现
2016/08/25 HTML / CSS
详解Sticky Footer 绝对底部的两种套路
2017/11/03 HTML / CSS
计算机网络工程专业职业生涯规划书
2014/03/10 职场文书
2015年学校少先队工作总结
2015/07/20 职场文书
幼儿园大班教育随笔
2015/08/14 职场文书
2016年9月份红领巾广播稿
2015/12/21 职场文书
《绝招》教学反思
2016/02/20 职场文书
mysql通过group by分组取最大时间对应数据的两种有效方法
2022/09/23 MySQL