文档章节

php5.4后htmlspecialchars输出为空的问题

mickelfeng
 mickelfeng
发布于 2018/05/16 22:32
字数 644
阅读 11
收藏 0

从旧版升级到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;
编译后,原程序就不用做任何调整了。
安装方法可参考:http://www.9enjoy.com/linux-upgrade-php54/

windows下怎么办?这个,自己想办法编译吧,难度比较大...
提供一个网址供参考:http://www.phpvim.net/web/php/build-php5-4-and-xdebug-on-win32.html
引用其一句话:准备好咖啡、可乐,做好准备,可能要折腾数小时…

本文转载自:http://www.9enjoy.com/php54-htmlspecialchars/

mickelfeng

mickelfeng

粉丝 237
博文 2799
码字总数 604314
作品 0
成都
高级程序员
私信 提问
php5.4后htmlspecialchars输出为空的问题

从旧版升级到php5.4,恐怕最麻烦的就是htmlspecialchars这个问题了!当然,htmlentities也会受影响,不过,对于中文站来说一般用htmlspecialchars比较常见,htmlentities非常少用到。 可能老...

JK_OPERA
2015/04/16
59
0
ecmall 中文字符空白处理

可能情况: 1.htmlspecialchars htmlspecialchars因为在php5.4默认为utf8 添加ENT_COMPAT ,'GB2312'即可 htmlspecialchars(cnsubstrR($title,$cfgtitlemaxlen),ENTCOMPAT ,'GB2312'); 第一个......

柠檬草的味道
2013/05/29
283
0
php htmlspecialchars 输出为空的原因

在php 5.3.5升为5.6后,部分程序代码的中htmlspecialchars输出为空,究其原因是 ENT_HTML401 [, string $encoding = 'UTF-8' [, bool $double_encode = true ]]] ) Defines encoding used in......

boydreaming
2016/11/28
53
0
php htmlentities和htmlspecialchars 的区别

很多人都以为htmlentities跟htmlspecialchars的功能是一样的,都是格式化html代码的,我以前也曾这么认为,但是今天我发现并不是这样的。 The translations performed are: 代码如下: '&' ...

tianhuahua
2013/10/01
151
0
ueditor的安全过滤机理

最近做博客系统,使用了最新的Ueditor(百度编辑器),比较担心安全注入的问题,做了一些测试. 我项目的思路是将编辑器中输入的内容使用htmlspecialchars方法实体化后存入数据库中,然后在需要显示...

manbudezhu
2017/08/03
369
0

没有更多内容

加载失败,请刷新页面

加载更多

最简单的获取相机拍照的图片

  import android.content.Intent;import android.graphics.Bitmap;import android.os.Bundle;import android.os.Environment;import android.provider.MediaStore;import andr......

MrLins
17分钟前
1
0
说好不哭!数据可视化深度干货,前端开发下一个涨薪点在这里~

随着互联网在各行各业的影响不断深入,数据规模越来越大,各企业也越来越重视数据的价值。作为一家专业的数据智能公司,个推从消息推送服务起家,经过多年的持续耕耘,积累沉淀了海量数据,在...

个推
19分钟前
4
0
第三方支付-返回与回调注意事项

不管是支付宝,微信,还是其它第三方支付,第四方支付,支付机构服务商只要涉及到钱的交易都要进行如下校验,全部成功了才视为成功订单 1.http请求是否成功 2.校验商户号 3.校验订单号及状态...

Shingfi
21分钟前
3
0
简述Java内存分配和回收策略以及Minor GC 和 Major GC(Full GC)

内存分配: 1. 栈区:栈可分为Java虚拟机和本地方法栈 2. 堆区:堆被所有线程共享,在虚拟机启动时创建,是唯一的目的是存放对象实例,是gc的主要区域。通常可分为两个区块年轻代和年老代。更...

DustinChan
27分钟前
4
0
Excel插入批注:可在批注插入文字、形状、图片

1.批注一直显示:审阅选项卡-------->勾选显示批注选项: 2.插入批注快捷键:Shift+F2 组合键 3.在批注中插入图片:鼠标右键点击批注框的小圆点【重点不可以在批注文本框内点击】----->调出批...

东方墨天
51分钟前
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部