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实现用户认证及管理完全源码
Mar 11 PHP
不要轻信 PHP_SELF的安全问题
Sep 05 PHP
用PHP写的基于Memcache的Queue实现代码
Nov 27 PHP
PHP数据库调用类调用实例(详细注释)
Jul 12 PHP
深入分析php之面向对象
May 15 PHP
PHP获取指定函数定义在哪个文件中以及其所在的行号实例
May 08 PHP
php操作csv文件代码实例汇总
Sep 22 PHP
CI框架学习笔记(一) - 环境安装、基本术语和框架流程
Oct 26 PHP
PHP PDO fetch 模式各种参数的输出结果一览
Jan 07 PHP
PHP高精确度运算BC函数库实例详解
Aug 15 PHP
php转换上传word文件为PDF的方法【基于COM组件】
Jun 10 PHP
Laravel 6.2 中添加了可调用容器对象的方法
Oct 22 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/12/06 PHP
学习php设计模式 php实现建造者模式
2015/12/07 PHP
WordPress中获取页面链接和标题的相关PHP函数用法解析
2015/12/17 PHP
php写app用的框架整理
2019/09/29 PHP
解决laravel资源加载路径设置的问题
2019/10/14 PHP
XmlUtils JS操作XML工具类
2009/10/01 Javascript
appendChild() 或 insertBefore()使用与区别介绍
2013/10/11 Javascript
js表头排序实现方法
2015/01/16 Javascript
Bootstrap学习笔记之js组件(4)
2016/06/12 Javascript
Vue.js快速入门教程
2016/09/07 Javascript
Extjs让combobox写起来简洁又漂亮
2017/01/05 Javascript
js案例之鼠标跟随jquery版(实例讲解)
2017/07/21 jQuery
微信小程序 授权登录详解(附完整源码)
2019/08/23 Javascript
《javascript设计模式》学习笔记七:Javascript面向对象程序设计组合模式详解
2020/04/08 Javascript
Vue Object.defineProperty及ProxyVue实现双向数据绑定
2020/09/02 Javascript
Python3遍历目录树实现方法
2015/05/22 Python
用Python写一个无界面的2048小游戏
2016/05/24 Python
python urllib urlopen()对象方法/代理的补充说明
2017/06/29 Python
python中将函数赋值给变量时需要注意的一些问题
2017/08/18 Python
使用python和Django完成博客数据库的迁移方法
2018/01/05 Python
Python使用Selenium+BeautifulSoup爬取淘宝搜索页
2018/02/24 Python
django用户注册、登录、注销和用户扩展的示例
2018/03/19 Python
Python开发之Nginx+uWSGI+virtualenv多项目部署教程
2019/05/13 Python
编写python代码实现简单抽奖器
2020/10/20 Python
非常漂亮的CSS3百叶窗焦点图动画
2016/02/24 HTML / CSS
html5自带表单验证体验优化及提示气泡修改功能
2017/09/12 HTML / CSS
基于 HTML5 WebGL 实现的医疗物流系统
2019/10/08 HTML / CSS
Vision Directa智利眼镜网:框架眼镜、隐形眼镜和名牌太阳眼镜
2016/11/23 全球购物
以设计师精品品质提供快速时尚:PopJulia
2018/01/09 全球购物
MSC邮轮官方网站:加勒比海、地中海和世界各地的假期
2018/08/27 全球购物
小露珠教学反思
2014/04/30 职场文书
优秀党员推荐材料
2014/12/18 职场文书
2016年“七一建党节”广播稿
2015/12/18 职场文书
文案策划岗位个人自我评价(范文)
2019/08/08 职场文书
原生Js 实现的简单无缝滚动轮播图的示例代码
2021/05/10 Javascript
Nginx反向代理学习实例教程
2021/10/24 Servers