• 163阅读
  • 2回复

PHP5.4及PHP5.5关于htmlspecialchars输出为空的问题

楼层直达
终于单位更换新的服务器,全部采用的windows server 2008 r2 64位系统,在艰难的配置环境之后,却发现IIS7.5应用池不断报错,后来更换了PHP5.5的64位版本,就解决了问题,看来在64位win2008下,还是64位PHP才是最佳搭配啊。 Lo<-;;vQ  
z(o zMH  
但是,,,苦逼的事情总是那么多,本人制作的网站是dede系统的,在登陆后台时却遇到了麻烦,登陆后提示HTTp500错误,一番搜索解决之后,又遇到发表新文章提示标题不能为空的问题,明明有标题,却不行?这是因为在PHP5.4及以后的版本中htmlspecialchars默认为UTF8,你是中文,当然检测不到你了。真纠结啊!只好按照解决DEDE标题为空的办法替换一了个遍,发现DEDE有十几处用到了htmlspecialchars属性,还好啦。 ryC7O'j_P  
r bfIH":  
另外转来一位技术大牛写的文章,希望对您有帮助。原文如下: XABB6J]  
c[E "  
从旧版升级到php5.4,恐怕最麻烦的就是htmlspecialchars这个问题了!当然,htmlentities也会受影响,不过,对于中文站来说一般用htmlspecialchars比较常见,htmlentities非常少用到。 rDD,eNjG  
VZhHO d  
可能老外认为网页普遍应该是utf-8编码的,于是苦了那些用GB2312,GBK编码的中文站......! ]Yw/}GKB  
3g{T+c*  
具体表现: 3}F{a8iIm  
LQo>wl  
$str = "9enjoy.com的php版本是5.2.10"; f|r +qe  
echo htmlspecialchars($str); us,~<e0  
(rT1wup  
gbk字符集下输出为空...utf-8下,输出正常。 &Sr7?u`k  
U#mrbW  
为什么呢,原因在于5.4.0对这个函数的变化: JA]qAr  
d^:(-2l-  
5.4.0   The default value for the encoding parameter was changed to UTF-8. Be4n\c.  
>&-" X# :  
原来是什么呢? 9bb 5?b/  
uupfL>h  
string htmlspecialchars ( string $string [, int $flags = ENT_COMPAT | ENT_HTML401 [, string $encoding = 'UTF-8' [, bool $double_encode = true ]]] ) =JM !`[  
yu9 8d1  
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. -6yFE- X/  
bi<?m^j  
原来是ISO-8859-1,5.4后默认变成utf-8!然后中文使用这个函数就输出为空白了。 z'r B_l  
](tv`1A,Wd  
国内一堆开源程序在5.4下都会有这样的问题,DISCUZ官方也建议用户不要升级到5.4。 >"%}x{|  
>SSRwYIN  
解决方案: W:TF8Onw  
y'21)P  
1.苦逼的修改所有用到htmlspecialchars地方的程序 hn p-x3  
N8K @ch3=P  
1.1 其第二个$flags参数,默认是ENT_COMPAT,因此改成 ~K-_]*[x  
htmlspecialchars($str,ENT_COMPAT,'GB2312'); O%R*1 P9  
为什么不是GBK?因为没有GBK这个参数,如果强行使用GBK,则报错给你看: Ljq!\D  
Warning: htmlspecialchars(): charset `gbk' not supported, assuming utf-8 HaiaDY)  
为了能使用GBK,则改成: dX vp-oi  
htmlspecialchars($str,ENT_COMPAT,'ISO-8859-1'); @ApX43U(  
*M^t@hl  
1.2.一样是改程序,但可以省略一个参数。 w\f>.N  
可以在网页头部加 LnY`f -H  
ini_set('default_charset','gbk'); Pcox~U/j  
然后改成 oPVyLD  
htmlspecialchars($str,ENT_COMPAT,''); _8;)J  
文档中有写: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. A0hfy|1#L  
大概意思就是:传入空字符串则使用default_charset的编码 zC[lPABQ  
|loo ^!I  
1.3.封装一个函数吧...本来htmlspecialchars这个单词一直不好记。 5HAIKc  
function htmlout($str) { buv*qPO  
    return htmlspecialchars($str,ENT_COMPAT,'ISO-8859-1'); 6QC=:_M;  
} N1Pm4joH%  
然后去批量替换。 &D[pX|!  
(3;dtp>Xx  
2.直接修改源码,重编译!这也是目前我在线上做的方案。 uDZ$'a  
修改ext/standard/html.c ^ld ?v  
大概在372行 W"@FRWcd  
/* Default is now UTF-8 */ XazKS4(  
if (charset_hint == NULL) kK]^q|vb6  
return cs_utf_8; D3>;X=1  
把cs_utf_8改成 cs_8859_1 a V4p0s6ZZ  
/* Default is now UTF-8 */ j9=QOq  
if (charset_hint == NULL) s] X]jfA.  
return cs_8859_1; onuhNn_=>  
编译后,原程序就不用做任何调整了。错
 
只看该作者 安逸沙发  发表于: 2017-09-09
昨天在写 PDO数据库封装类的 测试代码时遇到这个问题,取出的数组 使用 count 返回5,使用 array_keys 返回数组,但是在 dump 的时候却返回 null,纠结了好长时间,诸如下图: &;7\/m*W1  
D!TL~3d 1  
tsq]QTA*  
dump 函数用了好多年了,一直没有出现这个问题,我还以为是 $rowset 返回的是引用,所以还重新赋值了下, [Fe`}F}Co8  
我的dump函数如下: }NDw3{zn  
Php代码  收藏代码 M~;Ww-./  
function dump($vars, $label = '', $return = false)   d$g-u8  
{       {$4fRxj  
    $content = "<pre>\n";   ]1rr$f9  
    if ($label != '') {   LX4S}QXw  
        $content .= "<strong>{$label} :</strong>\n";   LJYFz=p "  
    }   n_sCZ6uXEQ  
    $content .= htmlspecialchars(print_r($vars, true));   "#d}S)GlXM  
    $content .= "\n</pre>\n";   U,Nf&g  
       ~oz8B^7i;  
    if ($return) { return $content; }   He. gl  
    echo $content;   4&~1|B{Z  
}   #A@*k}/+  
i1ur>4Ns  
话说这个函数从php4.3时代就跟着我打拼,一直没出现过啥问题,.... $S|bD$e  
i}N'W V`!  
最后 查了N多地方才把注意力移到这个上面,我机器上装的是 PHP5.5,我没有测试过到底是哪个版本就会出现这个问题,此处标记下,这个是坑... I0sd%'Ht?  
C^XJE1D.  
那行代码 改成: N^xnx<  
Php代码  收藏代码 ?@6N EfQf  
$content .= htmlspecialchars(print_r($vars, true),ENT_COMPAT | ENT_IGNORE);   L|EvI.f  
5;oWFl  
这个,增加第二个参数 ,并追加 )8p FPr  
Php代码  收藏代码 (e S4$$g  
| ENT_IGNORE   x6\EU=,  
,IF3VE&r  
d4t %/Uh  
写道 yt}Ve6  m  
string htmlentities ( string $string [, int $flags = ENT_COMPAT [, string $charset [, bool $double_encode = true ]]] ) |jH- bm  
O{SP4|0JV  
ENT_COMPAT 将双引号换成单引号 0sM{yGu=,  
ENT_QUOTES 将转换和单引号都翻倍。 l8 k@.<nCO  
ENT_NOQUOTES 将离开两双,单引号得救。 |N/Grk4  
ENT_IGNORE N}Q%y(O^  
静静地丢弃无效代码单元序列代替返回一个空字符串。在PHP 5.3.0补充说。这是供向后兼容性,避免使用它,因为它可能的安全隐患。 w=H   
#N9^C@  
Ndq/n21j  
支持的字符集列表 字符集 别名 描述 rT7W_[&P  
ISO-8859-1 ISO8859-1 西欧,Latin-1 X)^eaw]Q0  
ISO-8859-15 ISO8859-15 西欧,Latin-9。增加欧元符号,法语和芬兰语字母在 Latin-1(ISO-8859-1) 中缺失。 + 2 v6fan  
UTF-8 ASCII 兼容的多字节 8 位 Unicode。 4Bg"b/kF  
cp866 ibm866, 866 DOS 特有的西里尔编码。本字符集在 4.3.2 版本中得到支持。 MIma:N_c  
cp1251 Windows-1251, win-1251, 1251 Windows 特有的西里尔编码。本字符集在 4.3.2 版本中得到支持。 +9Q,[)e r  
cp1252 Windows-1252, 1252 Windows 特有的西欧编码。 S"hA@j  
KOI8-R koi8-ru, koi8r 俄语。本字符集在 4.3.2 版本中得到支持。 0%J0.USkM7  
BIG5 950 繁体中文,主要用于中国台湾省。 OBY^J1St  
GB2312 936 简体中文,中国国家标准字符集。 S;@nPzhc  
BIG5-HKSCS 繁体中文,附带香港扩展的 Big5 字符集。 @A32|p}  
Shift_JIS SJIS, 932 日语 h [*/Tnr  
EUC-JP EUCJP 日语
快速回复

限100 字节
安逸网提示:如果您在写长篇帖子又不马上发表,建议存为草稿
 
认证码:
上一个 下一个