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 29 PHP
MySQL连接数超过限制的解决方法
Jul 17 PHP
PHP中SESSION使用中的一点经验总结
Mar 30 PHP
关于mysql字符集设置了character_set_client=binary 在gbk情况下会出现表描述是乱码的情况
Jan 06 PHP
PHP+Mysql树型结构(无限分类)数据库设计的2种方式实例
Jul 15 PHP
从零开始学YII2框架(六)高级应用程序模板
Aug 20 PHP
在Ubuntu 14.04上部署 PHP 环境及 WordPress
Sep 02 PHP
自己写的兼容低于PHP 5.5版本的array_column()函数
Oct 24 PHP
Zend Framework入门知识点小结
Mar 19 PHP
PHP中strpos、strstr和stripos、stristr函数分析
Jun 11 PHP
php排序算法实例分析
Oct 17 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 采集心得技巧
2009/05/15 PHP
php smarty模版引擎中变量操作符及使用方法
2009/12/11 PHP
ThinkPHP5 验证器的具体使用
2018/05/31 PHP
Javascript remove 自定义数组删除方法
2009/10/20 Javascript
javascript instanceof 与typeof使用说明
2010/01/11 Javascript
Array.prototype.slice.apply的使用方法
2010/03/17 Javascript
javascript实现的弹出层背景置灰-模拟(easyui dialog)
2013/12/27 Javascript
使用JSON.parse将json字符串转换成json对象的时候会出错
2014/09/04 Javascript
显示今天的日期js代码(阳历和农历)
2014/09/30 Javascript
js实现多选项切换导航菜单的方法
2015/02/06 Javascript
jquery中EasyUI使用技巧小结
2015/02/10 Javascript
JS获取Table中td值的方法
2015/03/19 Javascript
JS+CSS实现的竖向简洁折叠菜单效果代码
2015/10/22 Javascript
Bootstrap多级导航栏(级联导航)的实现代码
2016/03/08 Javascript
学习使用bootstrap基本控件(table、form、button)
2016/04/12 Javascript
jQuery Ajax 异步加载显示等待效果代码分享
2016/08/01 Javascript
js中class的点击事件没有效果的解决方法
2016/10/13 Javascript
jQuery编写网页版2048小游戏
2017/01/06 Javascript
Javascript 严格模式use strict详解
2017/09/16 Javascript
NodeJS 实现多语言的示例代码
2018/09/11 NodeJs
JS实现贪吃蛇游戏
2019/11/15 Javascript
es6 super关键字的理解与应用实例分析
2020/02/15 Javascript
通过高德地图API获得某条道路上的所有坐标用于描绘道路的方法
2020/08/24 Javascript
npm全局环境变量配置详解
2020/12/15 Javascript
Python 变量类型及命名规则介绍
2013/06/08 Python
python获取豆瓣电影简介代码分享
2014/01/16 Python
Python模块WSGI使用详解
2018/02/02 Python
Python求解任意闭区间的所有素数
2018/06/10 Python
Python lxml库的简单介绍及基本使用讲解
2020/12/22 Python
四年大学生活的个人自我评价
2013/12/11 职场文书
汉语言文学毕业生自荐信范文
2014/03/24 职场文书
财会专业毕业生自荐信
2014/07/09 职场文书
行政经理岗位职责
2015/04/15 职场文书
Sql-Server数据库单表查询 4.3实验课
2021/04/05 SQL Server
请求模块urllib之PYTHON爬虫的基本使用
2022/04/08 Python
Python实现双向链表
2022/05/25 Python