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来处理多个提交任务
Oct 09 PHP
聊天室php&mysql(六)
Oct 09 PHP
PHP安全技术之 实现php基本安全
Sep 04 PHP
基于PHP输出缓存(output_buffering)的深入理解
Jun 13 PHP
php获取网页中图片、DIV内容的简单方法
Jun 19 PHP
ThinkPHP模板中判断volist循环的最后一条记录的验证方法
Jul 01 PHP
php实现的常见排序算法汇总
Sep 08 PHP
自己写的兼容低于PHP 5.5版本的array_column()函数
Oct 24 PHP
Laravel5中contracts详解
Mar 02 PHP
CodeIgniter与PHP5.6的兼容问题
Jul 16 PHP
ThinkPHP模板标签eq if 中区分0,null,false的方法
Mar 24 PHP
laravel + vue实现的数据统计绘图(今天、7天、30天数据)
Jul 31 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对象类型判断
2008/08/27 PHP
使用PHP强制下载PDF文件示例
2014/01/17 PHP
php中spl_autoload详解
2014/10/17 PHP
php实现向javascript传递数组的方法
2015/07/27 PHP
Yii框架中使用PHPExcel的方法分析
2019/07/25 PHP
Jquery iframe内部出滚动条
2010/02/11 Javascript
JavaScript对象之深度克隆介绍
2014/12/08 Javascript
整理AngularJS中的一些常用指令
2015/06/16 Javascript
基于JQuery实现图片轮播效果(焦点图)
2016/02/02 Javascript
NodeJS连接MongoDB数据库时报错的快速解决方法
2016/05/13 NodeJs
nodejs连接mongodb数据库实现增删改查
2016/12/01 NodeJs
EasyUI在Panel上动态添加LinkButton按钮
2017/08/11 Javascript
微信小程序 获取javascript 里的数据
2017/08/17 Javascript
剖析Angular Component的源码示例
2018/03/23 Javascript
详解在vue-cli项目下简单使用mockjs模拟数据
2018/10/19 Javascript
微信小程序全局变量功能与用法详解
2019/01/22 Javascript
世界上最短的数字判断js代码
2019/09/09 Javascript
vue.js iview打包上线后字体图标不显示解决办法
2020/01/20 Javascript
JS实现移动端可折叠导航菜单(现代都市风)
2020/07/07 Javascript
python使用循环实现批量创建文件夹示例
2014/03/25 Python
Python 将pdf转成图片的方法
2018/04/23 Python
使用pandas对两个dataframe进行join的实例
2018/06/08 Python
Pycharm无法使用已经安装Selenium的解决方法
2018/10/13 Python
numpy和pandas中数组的合并、拉直和重塑实例
2019/06/28 Python
Flask框架 CSRF 保护实现方法详解
2019/10/30 Python
Django 请求Request的具体使用方法
2019/11/11 Python
解决Python 异常TypeError: cannot concatenate 'str' and 'int' objects
2020/04/08 Python
python将dict中的unicode打印成中文实例
2020/05/11 Python
Space NK美国站:英国高端美妆护肤商城
2017/05/22 全球购物
高中自我评价分享
2013/12/05 职场文书
大众服装店创业计划书范文
2014/01/01 职场文书
新学期家长寄语
2014/01/19 职场文书
五星红旗迎风飘扬观后感
2015/06/17 职场文书
go语言map与string的相互转换的实现
2021/04/07 Golang
MySQL 不等于的三种使用及区别
2021/06/03 MySQL
详解Python中下划线的5种含义
2021/07/15 Python