php5.4后htmlspecialchars输出为空的问题
从旧版升级到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
引用其一句话:准备好咖啡、可乐,做好准备,可能要折腾数小时…
php5.4后htmlspecialchars输出为空的问题的更多相关文章
- 异步控制---实现函数asyncAll,在执行完传入数组中func1,func2,func3异步函数后,输出“end”
实现函数asyncAll,在执行完传入数组中func1,func2,func3异步函数后,输出"end" function func1(callback) { setTimeout ...
- python 牛客网 你的输出为:空。请检查一下你的代码,有没有循环输入处理多个case。问题解决
你的输出为:空.请检查一下你的代码,有没有循环输入处理多个case.点击查看如何处理多个case 核心:他这个程序测试正确与否的流程是 连续输入多组测试数据进行测试,只有每组数据都对才行 所以必须使用 ...
- 剑指offer15:反转链表后,输出新链表的表头。
1 题目描述 输入一个链表,反转链表后,输出新链表的表头. 2 思路和方法 (1)利用栈作为中间存储,进行链表的反转,将压入的数据按先进后出的顺序弹出依次赋给链表再输出表头pHead. (2)将当前节 ...
- php 升级后 htmlspecialchars 返回空 的解决方案
今天将php版本升级到5.3.0以上(我升级到php5.4.13)的版本后发现一个问题 htmlspecialchars 函数返回为空.查了资料后,发现新版本对htmlspecialchars这个函数 ...
- PAT树_层序遍历叶节点、中序建树后序输出、AVL树的根、二叉树路径存在性判定、奇妙的完全二叉搜索树、最小堆路径、文件路由
03-树1. List Leaves (25) Given a tree, you are supposed to list all the leaves in the order of top do ...
- 安装xdebug后var_dump输出没有格式化的问题
在ubuntu10.04下面配置Apache2.2 + PHP5.3的开发环境,顺便装了一个xdebug扩展方便调试代码. 但是环境配置好了之后却发现xdebug加载成功了但是var_dump输出的内 ...
- verilog实验3:AD转换后串口输出到PC端
一.实验任务 通过tcl549AD转换芯片将模拟电压信号转换为数字信号,并通过串口显示到电脑上.此AD转换芯片为串行转换芯片,且转换速率要和串口选择的速率匹配.等待串口发送完后,再进行下一次AD转换. ...
- python reload(sys) 后无法输出
重新加载sys后,在idle里无法输出内容.出现这种情况,需要将sys的三个变量重新定义. 在重新载入sys之前,为三个变量赋值 a,b,c = sys.studin,sys.studout,sys. ...
- php安装xdebug后var_dump输出没有格式化的问题
开发环境,装了一个xdebug扩展方便调试代码. 但是环境配置好了之后却发现xdebug加载成功了但是var_dump输出的内容却没有使用html格式化 这时想到估计是php.ini里面的某个输出的配 ...
随机推荐
- NPOI 上传Excel功能(二)
3.上传文件,写入log using DC.BE.Business.SYS; using DC.BE.Entity.ERP; using DC.BE.Entity.SAS; using DC.BE.E ...
- k8s(一) kubeadm简单集群初始化
写给想入门kubernetes的同学们 # 系统版本 [root@master ~]# cat /etc/os-release NAME="CentOS Linux" VERSIO ...
- webpack——快速入门【一】
学习webpack https://github.com/webproblem/learning-article#webpack https://github.com/lengziyu/learn-w ...
- HDU 4344-Mark the Rope-大数素因子分解
注意只有一个素因子的情况. #include <cstdio> #include <algorithm> #include <cstring> using name ...
- poj 2226 Muddy Fields(水二分图)
Rain has pummeled the cows' field, a rectangular grid of R rows and C columns (1 <= R <= 50, 1 ...
- 【AGC005F】Many Easy Problems FFT 容斥原理
题目大意 给你一棵树,有\(n\)个点.还给你了一个整数\(k\). 设\(S\)为树上某些点的集合,定义\(f(S)\)为最小的包含\(S\)的联通子图的大小. \(n\)个点选\(k\)个点一共有 ...
- Gogs 部署安装(Linux)
环境 centos7:golang+mysqldb+git. 安装配置环境[mysql装了请跳过] yum install mysql-community-server go git -y 配置防火墙 ...
- Android 简单天气预报
IDE: Android studio3.1.2 界面: activity_main.xml
- Ubuntu下编写终端界面交互式C++小程序的一些Trick(小技巧,gnome-terminal)
类getch()功能的实现 I 只要在Windows下用过C/C++就会很熟悉conio.h库中的一个函数getch(),它可以绕过终端输入缓冲区直接从键盘读取一个字符,并且不在界面上显示. 但如果想 ...
- 【dfs】p1731 生日蛋糕
1441:[例题2]生日蛋搞 [题目描述] 7月17日是Mr.W的生日,ACM-THU为此要制作一个体积为Nπ的M层生日蛋糕,每层都是一个圆柱体.设从下往上数第i(1≤i≤M)层蛋糕是半径为Ri, 高 ...