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 相关文章推荐
Windows下IIS6/Apache2.2.4+MySQL5.2+PHP5.2.1安装配置方法
May 03 PHP
PHP 基本语法格式
Dec 15 PHP
PHP备份/还原MySQL数据库的代码
Jan 06 PHP
php cookies中删除的一般赋值方法
May 07 PHP
php颜色转换函数hex-rgb(将十六进制格式转成十进制格式)
Sep 23 PHP
PHP开发注意事项总结
Feb 04 PHP
CodeIgniter表单验证方法实例详解
Mar 03 PHP
总结PHP中数值计算的注意事项
Aug 14 PHP
php处理单文件、多文件上传代码分享
Aug 24 PHP
万能的php分页类
Jul 06 PHP
实例分析PHP将字符串转换成数字的方法
Jan 27 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
destoon安装出现Internal Server Error的解决方法
2014/06/21 PHP
分享php邮件管理器源码
2016/01/06 PHP
Yii2.0使用阿里云OSS的SDK上传图片、下载、删除图片示例
2017/09/20 PHP
围观tangram js库
2010/12/28 Javascript
jquery 单引号和双引号的区别及使用注意
2013/07/31 Javascript
简介alert()与console.log()的不同
2015/08/26 Javascript
JS实现图片高亮展示效果实例
2015/11/24 Javascript
动态的9*9乘法表效果的实现代码
2016/05/16 Javascript
深入理解setTimeout函数和setInterval函数
2016/05/20 Javascript
Javascript 5种方法实现过滤删除前后所有空格
2016/06/22 Javascript
Bootstrap 最常用的JS插件系列总结(图片轮播、标签切换等)
2016/07/14 Javascript
微信小程序 animation API详解及实例代码
2016/10/08 Javascript
解析JavaScript实现DDoS攻击原理与保护措施
2016/12/26 Javascript
React创建组件的三种方式及其区别
2017/01/12 Javascript
微信小程序中使用javascript 回调函数
2017/05/11 Javascript
JavaScript中各数制转换全面总结
2017/08/21 Javascript
Node.js+jade抓取博客所有文章生成静态html文件的实例
2017/09/19 Javascript
es6 symbol的实现方法示例
2019/04/02 Javascript
vue+Element-ui实现登录注册表单
2020/11/17 Javascript
Python字典操作简明总结
2015/04/13 Python
python实现树的深度优先遍历与广度优先遍历详解
2019/10/26 Python
flask框架json数据的拿取和返回操作示例
2019/11/28 Python
Python脚本如何在bilibili中查找弹幕发送者
2020/06/04 Python
python如何写个俄罗斯方块
2020/11/06 Python
Python 爬取淘宝商品信息栏目的实现
2021/02/06 Python
Python 实现劳拉游戏的实例代码(四连环、重力四子棋)
2021/03/03 Python
HTML5 Canvas基本线条绘制的实例教程
2016/03/17 HTML / CSS
绿色城市实施方案
2014/03/19 职场文书
工伤事故赔偿协议书范文
2014/09/24 职场文书
优秀员工推荐材料
2014/12/20 职场文书
升职感谢信
2015/01/22 职场文书
职称评定个人总结
2015/03/05 职场文书
2015年社区环境卫生工作总结
2015/04/21 职场文书
家长会开场白和结束语
2015/05/29 职场文书
2015年中学团委工作总结
2015/07/22 职场文书
python代码实现扫码关注公众号登录的实战
2021/11/01 Python