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 相关文章推荐
php 魔术函数使用说明
Feb 21 PHP
php中用于检测一个地理IP地址是否可用的代码
Feb 19 PHP
PHP编程中的常见漏洞和代码实例
Aug 06 PHP
php使用pdo连接并查询sql数据库的方法
Dec 24 PHP
PHP中使用php5-ffmpeg撷取视频图片实例
Jan 07 PHP
php中解析带中文字符的url函数分享
Jan 20 PHP
smarty模板引擎中内建函数if、elseif和else的使用方法
Jan 22 PHP
php绘制圆形的方法
Jan 24 PHP
php检查是否是ajax请求的方法
Apr 16 PHP
ThinkPHP设置禁止百度等搜索引擎转码(简单实用)
Feb 15 PHP
PHP模型Model类封装数据库操作示例
Mar 14 PHP
PHP面向对象程序设计内置标准类,普通数据类型转为对象类型示例
Jun 12 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脚本
2006/11/26 PHP
PHP文件缓存类实现代码
2015/10/26 PHP
php foreach如何跳出两层循环(详解)
2016/11/05 PHP
细品javascript 寻址,闭包,对象模型和相关问题
2009/04/27 Javascript
jquery入门—数据删除与隔行变色以及图片预览
2013/01/07 Javascript
javascript强制点击广告的方法
2015/02/06 Javascript
jQuery实现的向下图文信息滚动效果
2015/05/03 Javascript
JavaScript实现非常简单实用的下拉菜单效果
2015/08/27 Javascript
jquery实现倒计时功能
2015/12/28 Javascript
jQuery Easyui Tabs扩展根据自定义属性打开页签
2016/08/15 Javascript
JS实现间歇滚动的运动效果实例
2016/12/22 Javascript
jQuery md5加密插件jQuery.md5.js用法示例
2018/08/24 jQuery
JavaScript常见继承模式实例小结
2019/01/11 Javascript
简谈创建React Component的几种方式
2019/06/15 Javascript
react 移动端实现列表左滑删除的示例代码
2019/07/04 Javascript
js最全的数组的降维5种办法(小结)
2020/04/28 Javascript
可拖拽组件slider.js使用方法详解
2020/12/04 Javascript
Python对两个有序列表进行合并和排序的例子
2014/06/13 Python
python实现批量图片格式转换
2020/06/16 Python
Python3 Post登录并且保存cookie登录其他页面的方法
2018/12/28 Python
Python+selenium点击网页上指定坐标的实例
2019/07/05 Python
python批量将excel内容进行翻译写入功能
2019/10/10 Python
python通过matplotlib生成复合饼图
2020/02/06 Python
Python使用扩展库pywin32实现批量文档打印实例
2020/04/09 Python
HTML5 Canvas 绘图——使用 Canvas 绘制图形图文教程 使用html5 canvas 绘制精美的图
2015/08/31 HTML / CSS
英国最大的老式糖果店:A Quarter Of
2017/04/08 全球购物
法国一家多品牌成衣精品中/高档商店:Graduate Store
2019/08/28 全球购物
什么是.net
2015/08/03 面试题
电气工程及其自动化自我评价四篇
2013/09/24 职场文书
高三自我鉴定
2013/10/23 职场文书
军训自我鉴定怎么写
2014/02/13 职场文书
婚假请假条怎么写
2014/04/10 职场文书
2014年社区综治工作总结
2014/11/17 职场文书
2015年女职工工作总结
2015/05/15 职场文书
初三化学教学反思
2016/02/22 职场文书
Flutter Navigator 实现路由传递参数
2022/04/22 Java/Android