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 相关文章推荐
mysql中存储过程、函数的一些问题
Feb 14 PHP
PHP压缩html网页代码(清除空格,换行符,制表符,注释标记)
Apr 02 PHP
php模拟js函数unescape的函数代码
Oct 20 PHP
PHP和.net中des加解密的实现方法
Feb 27 PHP
php网站判断用户是否是手机访问的方法
Nov 01 PHP
php保存二进制原始数据为图片的程序代码
Oct 14 PHP
Yii2.0表关联查询实例分析
Jul 18 PHP
php实现解析xml并生成sql语句的方法
Feb 03 PHP
PHP操作XML中XPath的应用示例
Jul 04 PHP
php传值和传引用的区别点总结
Nov 19 PHP
PHP查找一列有序数组是否包含某值的方法
Feb 07 PHP
如何利用PHP实现上传图片功能详解
Sep 24 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函数之error_reporting(E_ALL ^ E_NOTICE)详细说明
2011/07/01 PHP
destoon在各个服务器下设置URL Rewrite(伪静态)的方法
2014/06/21 Servers
Yii2.0中的COOKIE和SESSION用法
2016/08/12 PHP
PHP快速排序quicksort实例详解
2016/09/28 PHP
php中照片旋转 (orientation) 问题的正确处理
2017/02/16 PHP
php判断文件上传图片格式的实例详解
2017/09/30 PHP
用js实现随机返回数组的一个元素
2007/08/13 Javascript
javascript 兼容鼠标滚轮事件
2009/04/07 Javascript
使用jQuery操作Cookies的实现代码
2011/10/09 Javascript
jquery scroll()区分横向纵向滚动条的方法
2014/04/04 Javascript
JavaScript避免代码的重复执行经验技巧分享
2014/04/17 Javascript
JSON.parse()和JSON.stringify()使用介绍
2014/06/20 Javascript
基于JavaScript实现单选框下拉菜单添加文件效果
2016/06/26 Javascript
jQuery插件echarts实现的多折线图效果示例【附demo源码下载】
2017/03/04 Javascript
Angular中的interceptors拦截器
2017/06/25 Javascript
浅谈Vue.js应用的四种AJAX请求数据模式
2017/08/30 Javascript
在js代码拼接dom对象到页面上的模板总结
2018/10/21 Javascript
es6数值的扩展方法
2019/03/11 Javascript
使用vue自定义指令开发表单验证插件validate.js
2019/05/23 Javascript
JS获取动态添加元素的方法详解
2019/07/31 Javascript
原生javascript如何实现共享onload事件
2020/07/03 Javascript
原生JS实现拖拽效果
2020/12/04 Javascript
node koa2 ssr项目搭建的方法步骤
2020/12/11 Javascript
Python2和Python3中print的用法示例总结
2017/10/25 Python
python实现简单的单变量线性回归方法
2018/11/08 Python
使用tensorflow实现矩阵分解方式
2020/02/07 Python
python实现excel公式格式化的示例代码
2020/12/23 Python
英国天然抗衰老护肤品品牌:Nakin Skin Care
2019/04/16 全球购物
PHP面试题集
2016/12/18 面试题
《玩具柜台前的孩子》教学反思
2014/02/13 职场文书
节电标语大全
2014/06/23 职场文书
Pytorch 使用tensor特定条件判断索引
2021/04/08 Python
彻底理解golang中什么是nil
2021/04/29 Golang
Python3中最常用的5种线程锁实例总结
2021/07/07 Python
Java8中Stream的一些神操作
2021/11/02 Java/Android
SQLServer权限之只开启创建表权限
2022/04/12 SQL Server