• 57阅读
  • 2回复

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

楼层直达
终于单位更换新的服务器,全部采用的windows server 2008 r2 64位系统,在艰难的配置环境之后,却发现IIS7.5应用池不断报错,后来更换了PHP5.5的64位版本,就解决了问题,看来在64位win2008下,还是64位PHP才是最佳搭配啊。 eHDN\QA 2  
<<R*2b  
但是,,,苦逼的事情总是那么多,本人制作的网站是dede系统的,在登陆后台时却遇到了麻烦,登陆后提示HTTp500错误,一番搜索解决之后,又遇到发表新文章提示标题不能为空的问题,明明有标题,却不行?这是因为在PHP5.4及以后的版本中htmlspecialchars默认为UTF8,你是中文,当然检测不到你了。真纠结啊!只好按照解决DEDE标题为空的办法替换一了个遍,发现DEDE有十几处用到了htmlspecialchars属性,还好啦。 u^qT2Ss0  
*itUWpNhr  
另外转来一位技术大牛写的文章,希望对您有帮助。原文如下: SJ>vwmA4  
wT8DSq  
从旧版升级到php5.4,恐怕最麻烦的就是htmlspecialchars这个问题了!当然,htmlentities也会受影响,不过,对于中文站来说一般用htmlspecialchars比较常见,htmlentities非常少用到。 "u^H# L>-q  
OA"q[s  
可能老外认为网页普遍应该是utf-8编码的,于是苦了那些用GB2312,GBK编码的中文站......! Vt&2z)Zz  
r:ptQo`1-  
具体表现: aH/ k Ua  
KEjWRwN  
$str = "9enjoy.com的php版本是5.2.10"; GH:jH]u!V  
echo htmlspecialchars($str); C mWgcw1  
7/@TF/V  
gbk字符集下输出为空...utf-8下,输出正常。 P%&0]FCx  
=QiI :|eRA  
为什么呢,原因在于5.4.0对这个函数的变化: Mc_YPR:C  
Eq9x2  
5.4.0   The default value for the encoding parameter was changed to UTF-8. RF4vtQC=  
4`]^@"{  
原来是什么呢? {xB!EQ"  
cyv`B3}  
string htmlspecialchars ( string $string [, int $flags = ENT_COMPAT | ENT_HTML401 [, string $encoding = 'UTF-8' [, bool $double_encode = true ]]] ) >xYpNtEs  
_] sn0rX  
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. OXSmt DvJ  
xH(lm2kvT  
原来是ISO-8859-1,5.4后默认变成utf-8!然后中文使用这个函数就输出为空白了。 G"U9E5O  
eH3JyzzP,  
国内一堆开源程序在5.4下都会有这样的问题,DISCUZ官方也建议用户不要升级到5.4。 wh\}d4gN  
bv9i*]  
解决方案: 4Lh!8g=/  
_8riUt  
1.苦逼的修改所有用到htmlspecialchars地方的程序 g\(G\ tnu>  
oMD>Yw c-  
1.1 其第二个$flags参数,默认是ENT_COMPAT,因此改成 HU }7zK2  
htmlspecialchars($str,ENT_COMPAT,'GB2312'); ICoHI  
为什么不是GBK?因为没有GBK这个参数,如果强行使用GBK,则报错给你看: [vK ^Um  
Warning: htmlspecialchars(): charset `gbk' not supported, assuming utf-8 *@r/5pM2}  
为了能使用GBK,则改成: =Z3F1Cq?  
htmlspecialchars($str,ENT_COMPAT,'ISO-8859-1'); N/'b$m5= S  
5 +YH.4R  
1.2.一样是改程序,但可以省略一个参数。  E`0?  
可以在网页头部加 '8. r-`l(  
ini_set('default_charset','gbk'); n;Q7X>-f8`  
然后改成 |`,2ri*5A  
htmlspecialchars($str,ENT_COMPAT,''); VT`^W Hu  
文档中有写: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. $}q23  
大概意思就是:传入空字符串则使用default_charset的编码 T_ <@..C  
4JXeV&5Qk'  
1.3.封装一个函数吧...本来htmlspecialchars这个单词一直不好记。 rjAn@!|:+  
function htmlout($str) {  6f>{"'  
    return htmlspecialchars($str,ENT_COMPAT,'ISO-8859-1'); dNH08q8P  
} EhvX)s  
然后去批量替换。 OU.6bmWy|  
mb3"U"ohs  
2.直接修改源码,重编译!这也是目前我在线上做的方案。 jo@6?( *4  
修改ext/standard/html.c fu ,}1Mq#  
大概在372行 u@M,qo`  
/* Default is now UTF-8 */ ~<5!?6Yt  
if (charset_hint == NULL) &64h ;P<  
return cs_utf_8; [ /b2=>  
把cs_utf_8改成 cs_8859_1 wo/\]5  
/* Default is now UTF-8 */ q!7ANib6O  
if (charset_hint == NULL) P>D)7 V9Hh  
return cs_8859_1; p)-^;=<B3  
编译后,原程序就不用做任何调整了。错
 
只看该作者 安逸沙发  发表于: 09-09
昨天在写 PDO数据库封装类的 测试代码时遇到这个问题,取出的数组 使用 count 返回5,使用 array_keys 返回数组,但是在 dump 的时候却返回 null,纠结了好长时间,诸如下图: >_<J=8|E  
y{`aM(&  
{|jrYU.k~  
dump 函数用了好多年了,一直没有出现这个问题,我还以为是 $rowset 返回的是引用,所以还重新赋值了下, }+" N '  
我的dump函数如下: +dt b~M  
Php代码  收藏代码 =LsW\.T6  
function dump($vars, $label = '', $return = false)   3 E~d  
{       4ZRE3^y\"  
    $content = "<pre>\n";   XQH wu  
    if ($label != '') {   fuwv,[m  
        $content .= "<strong>{$label} :</strong>\n";   !aVwmd'9  
    }   ] VN4;R  
    $content .= htmlspecialchars(print_r($vars, true));   s[ CnJZ\q  
    $content .= "\n</pre>\n";   w'Cn3b)`  
       Pdg%:aY  
    if ($return) { return $content; }   X+: >&&9  
    echo $content;   :=0XT`iY  
}   sbZ^BFqp  
|&>!"27;w  
话说这个函数从php4.3时代就跟着我打拼,一直没出现过啥问题,.... ?^# h|aUp.  
s`bC?wr5h  
最后 查了N多地方才把注意力移到这个上面,我机器上装的是 PHP5.5,我没有测试过到底是哪个版本就会出现这个问题,此处标记下,这个是坑... ^aW?0qsH  
Xgy)Z:R  
那行代码 改成: 'pUJlPGx  
Php代码  收藏代码 GisI/Ir[  
$content .= htmlspecialchars(print_r($vars, true),ENT_COMPAT | ENT_IGNORE);   bi fi02  
_t:l:x.;T  
这个,增加第二个参数 ,并追加 [N|/d#  
Php代码  收藏代码 S;o U'KOY  
| ENT_IGNORE   CIM 9~:\  
q4k)E  
seFug  
写道 Tl#Jf3XY}  
string htmlentities ( string $string [, int $flags = ENT_COMPAT [, string $charset [, bool $double_encode = true ]]] ) iA~b[20&  
ub "(,k P  
ENT_COMPAT 将双引号换成单引号 /H)K_H#|;  
ENT_QUOTES 将转换和单引号都翻倍。 8s4y7%,|  
ENT_NOQUOTES 将离开两双,单引号得救。 8gap _qTo  
ENT_IGNORE WgdL^PN(h  
静静地丢弃无效代码单元序列代替返回一个空字符串。在PHP 5.3.0补充说。这是供向后兼容性,避免使用它,因为它可能的安全隐患。 U*Z P>Vv  
>G2o  
U[zY0B  
支持的字符集列表 字符集 别名 描述 {~ yj]+Im  
ISO-8859-1 ISO8859-1 西欧,Latin-1 >4a@rT/  
ISO-8859-15 ISO8859-15 西欧,Latin-9。增加欧元符号,法语和芬兰语字母在 Latin-1(ISO-8859-1) 中缺失。 s-eC')w~E  
UTF-8 ASCII 兼容的多字节 8 位 Unicode。 Q? a&q0f  
cp866 ibm866, 866 DOS 特有的西里尔编码。本字符集在 4.3.2 版本中得到支持。 ,ZcW+!  
cp1251 Windows-1251, win-1251, 1251 Windows 特有的西里尔编码。本字符集在 4.3.2 版本中得到支持。 ;T2)nSAqt  
cp1252 Windows-1252, 1252 Windows 特有的西欧编码。 g$~3@zD  
KOI8-R koi8-ru, koi8r 俄语。本字符集在 4.3.2 版本中得到支持。 > _U)=q  
BIG5 950 繁体中文,主要用于中国台湾省。 QP|Ou*Qm)  
GB2312 936 简体中文,中国国家标准字符集。 p_Fc:%j>  
BIG5-HKSCS 繁体中文,附带香港扩展的 Big5 字符集。 H,qIHQW#  
Shift_JIS SJIS, 932 日语 9|dgmEd  
EUC-JP EUCJP 日语
快速回复

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