• 85阅读
  • 2回复

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

楼层直达
终于单位更换新的服务器,全部采用的windows server 2008 r2 64位系统,在艰难的配置环境之后,却发现IIS7.5应用池不断报错,后来更换了PHP5.5的64位版本,就解决了问题,看来在64位win2008下,还是64位PHP才是最佳搭配啊。 "&;8U.  
3SI:su  
但是,,,苦逼的事情总是那么多,本人制作的网站是dede系统的,在登陆后台时却遇到了麻烦,登陆后提示HTTp500错误,一番搜索解决之后,又遇到发表新文章提示标题不能为空的问题,明明有标题,却不行?这是因为在PHP5.4及以后的版本中htmlspecialchars默认为UTF8,你是中文,当然检测不到你了。真纠结啊!只好按照解决DEDE标题为空的办法替换一了个遍,发现DEDE有十几处用到了htmlspecialchars属性,还好啦。 " !43,!<  
p|fSPSz  
另外转来一位技术大牛写的文章,希望对您有帮助。原文如下: )c|S)iJ7=z  
aDEz |>q  
从旧版升级到php5.4,恐怕最麻烦的就是htmlspecialchars这个问题了!当然,htmlentities也会受影响,不过,对于中文站来说一般用htmlspecialchars比较常见,htmlentities非常少用到。 k\->uSU9  
GP=i6I6C  
可能老外认为网页普遍应该是utf-8编码的,于是苦了那些用GB2312,GBK编码的中文站......! ?^y%UIzf  
74f3a|vx/  
具体表现: $7M/rF;N5X  
|]=. ^  
$str = "9enjoy.com的php版本是5.2.10"; T.ZPpxY  
echo htmlspecialchars($str); fzcPi9+  
_D{zB1d\0  
gbk字符集下输出为空...utf-8下,输出正常。 u=j|']hp#&  
lIR0jgP@z  
为什么呢,原因在于5.4.0对这个函数的变化: jC_7cAsl  
`v2]Jk<  
5.4.0   The default value for the encoding parameter was changed to UTF-8. O<}^`4d  
%cIF()  
原来是什么呢? [h"#Gwb=;  
5<0d2bK$  
string htmlspecialchars ( string $string [, int $flags = ENT_COMPAT | ENT_HTML401 [, string $encoding = 'UTF-8' [, bool $double_encode = true ]]] ) @3D8TPH  
fwR3=:5~  
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. k:?+75?$  
!83x,*O  
原来是ISO-8859-1,5.4后默认变成utf-8!然后中文使用这个函数就输出为空白了。 {HgW9N(  
D+ki2UVt&  
国内一堆开源程序在5.4下都会有这样的问题,DISCUZ官方也建议用户不要升级到5.4。 6k#H>zY,  
hl4@Y#n  
解决方案: 6{O#!o*g  
1[k~*QS  
1.苦逼的修改所有用到htmlspecialchars地方的程序 ~;ink   
Kuh! b`9  
1.1 其第二个$flags参数,默认是ENT_COMPAT,因此改成 Z=: oIAe  
htmlspecialchars($str,ENT_COMPAT,'GB2312'); -KRHcr \  
为什么不是GBK?因为没有GBK这个参数,如果强行使用GBK,则报错给你看: //--r5Q  
Warning: htmlspecialchars(): charset `gbk' not supported, assuming utf-8 M mg#Vy~  
为了能使用GBK,则改成: 1SBc:!2  
htmlspecialchars($str,ENT_COMPAT,'ISO-8859-1'); ]{9oB-;,  
c$f|a$$b   
1.2.一样是改程序,但可以省略一个参数。 +n(H"I7cU  
可以在网页头部加 0w >DU^+  
ini_set('default_charset','gbk'); v9~Hl   
然后改成 XEqg%f  
htmlspecialchars($str,ENT_COMPAT,''); $ql-"BB  
文档中有写: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. |-7<?aw"  
大概意思就是:传入空字符串则使用default_charset的编码 ;>=hQC{f>  
^&uWAQohL  
1.3.封装一个函数吧...本来htmlspecialchars这个单词一直不好记。 ilK8V4k<T)  
function htmlout($str) { Rn{q/h  
    return htmlspecialchars($str,ENT_COMPAT,'ISO-8859-1'); EpGe'S  
} M O5fu!  
然后去批量替换。 \Y9=d E}  
:kZ2N67  
2.直接修改源码,重编译!这也是目前我在线上做的方案。 se_zCS4Y  
修改ext/standard/html.c | 7>1)  
大概在372行 !W$3p'8Tu  
/* Default is now UTF-8 */ M _U$I7  
if (charset_hint == NULL) (I.uQP~H  
return cs_utf_8; ! # tRl  
把cs_utf_8改成 cs_8859_1 Cw{#(xX  
/* Default is now UTF-8 */ N 5/TV%u  
if (charset_hint == NULL) y8+?:=N.  
return cs_8859_1; ">fgoDQ  
编译后,原程序就不用做任何调整了。错
 
只看该作者 安逸沙发  发表于: 09-09
昨天在写 PDO数据库封装类的 测试代码时遇到这个问题,取出的数组 使用 count 返回5,使用 array_keys 返回数组,但是在 dump 的时候却返回 null,纠结了好长时间,诸如下图: [$UI8tV  
HGg@ _9tW  
K3uRs{l|  
dump 函数用了好多年了,一直没有出现这个问题,我还以为是 $rowset 返回的是引用,所以还重新赋值了下, veECfR;  
我的dump函数如下: BY*8ri^u  
Php代码  收藏代码 hi[pVk~B)  
function dump($vars, $label = '', $return = false)   ],].zlN  
{       ?aMOZn?  
    $content = "<pre>\n";   sDV Q#}a  
    if ($label != '') {   93hxSRw  
        $content .= "<strong>{$label} :</strong>\n";   poFg 1  
    }   u]@['7  
    $content .= htmlspecialchars(print_r($vars, true));   akQ7K  
    $content .= "\n</pre>\n";   jc9y<{~x/  
       0m ? )ROaJ  
    if ($return) { return $content; }   ?bu>r=oIO]  
    echo $content;   {l >hMxij  
}   GPkpXVm  
@=kSo -SX  
话说这个函数从php4.3时代就跟着我打拼,一直没出现过啥问题,.... 1-QS~)+  
;*&-C9b  
最后 查了N多地方才把注意力移到这个上面,我机器上装的是 PHP5.5,我没有测试过到底是哪个版本就会出现这个问题,此处标记下,这个是坑... v*yuE5{  
wlmRe`R  
那行代码 改成: -Y;3I00(  
Php代码  收藏代码 _<2E"PrT   
$content .= htmlspecialchars(print_r($vars, true),ENT_COMPAT | ENT_IGNORE);   WMg~Y"W  
~y[7K{{ ;T  
这个,增加第二个参数 ,并追加 tklH@'q  
Php代码  收藏代码 7J&4akT{9  
| ENT_IGNORE   4ss4kp_>  
jlg(drTo  
!5?<% *  
写道 T9q-,w/j;  
string htmlentities ( string $string [, int $flags = ENT_COMPAT [, string $charset [, bool $double_encode = true ]]] ) NW)1#]gg%  
s(roJbJ_;  
ENT_COMPAT 将双引号换成单引号 kz7(Z'pw  
ENT_QUOTES 将转换和单引号都翻倍。 @AuO`I@p=  
ENT_NOQUOTES 将离开两双,单引号得救。 uA#;G/$  
ENT_IGNORE 5i{j' {_(8  
静静地丢弃无效代码单元序列代替返回一个空字符串。在PHP 5.3.0补充说。这是供向后兼容性,避免使用它,因为它可能的安全隐患。 _n\GNUA  
b\+`e b8_  
Mh 7DV  
支持的字符集列表 字符集 别名 描述  1ZB"EQ  
ISO-8859-1 ISO8859-1 西欧,Latin-1 U|j`e5)  
ISO-8859-15 ISO8859-15 西欧,Latin-9。增加欧元符号,法语和芬兰语字母在 Latin-1(ISO-8859-1) 中缺失。 %GIr&V4|  
UTF-8 ASCII 兼容的多字节 8 位 Unicode。 *s iFj CN<  
cp866 ibm866, 866 DOS 特有的西里尔编码。本字符集在 4.3.2 版本中得到支持。 SOvF[,+  
cp1251 Windows-1251, win-1251, 1251 Windows 特有的西里尔编码。本字符集在 4.3.2 版本中得到支持。 >~+ELVB&  
cp1252 Windows-1252, 1252 Windows 特有的西欧编码。 Hg (Gl  
KOI8-R koi8-ru, koi8r 俄语。本字符集在 4.3.2 版本中得到支持。 (0kK_k'T  
BIG5 950 繁体中文,主要用于中国台湾省。 [Cv/{f3]u{  
GB2312 936 简体中文,中国国家标准字符集。 cD'V>[h  
BIG5-HKSCS 繁体中文,附带香港扩展的 Big5 字符集。 ~z;FP$U  
Shift_JIS SJIS, 932 日语  | (_  
EUC-JP EUCJP 日语
快速回复

限100 字节
安逸网提示:如果您提交过一次失败了,可以用”恢复数据”来恢复帖子内容
 
认证码:
上一个 下一个