• 329阅读
  • 2回复

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

楼层直达
终于单位更换新的服务器,全部采用的windows server 2008 r2 64位系统,在艰难的配置环境之后,却发现IIS7.5应用池不断报错,后来更换了PHP5.5的64位版本,就解决了问题,看来在64位win2008下,还是64位PHP才是最佳搭配啊。 {~=gKZ:-@  
p1\E C#Q  
但是,,,苦逼的事情总是那么多,本人制作的网站是dede系统的,在登陆后台时却遇到了麻烦,登陆后提示HTTp500错误,一番搜索解决之后,又遇到发表新文章提示标题不能为空的问题,明明有标题,却不行?这是因为在PHP5.4及以后的版本中htmlspecialchars默认为UTF8,你是中文,当然检测不到你了。真纠结啊!只好按照解决DEDE标题为空的办法替换一了个遍,发现DEDE有十几处用到了htmlspecialchars属性,还好啦。 MWn []'TpH  
?d)eri8,  
另外转来一位技术大牛写的文章,希望对您有帮助。原文如下: <QK2Wc_}-"  
w 1O)  
从旧版升级到php5.4,恐怕最麻烦的就是htmlspecialchars这个问题了!当然,htmlentities也会受影响,不过,对于中文站来说一般用htmlspecialchars比较常见,htmlentities非常少用到。 ~0{F,R.$  
3.04Toq!  
可能老外认为网页普遍应该是utf-8编码的,于是苦了那些用GB2312,GBK编码的中文站......! %e=UYBj"  
(ZK(ODn)i  
具体表现: h{VGh kU9f  
/}-LaiS  
$str = "9enjoy.com的php版本是5.2.10"; kc"SUiy/  
echo htmlspecialchars($str); F[oTc^dr  
M7AUY#)  
gbk字符集下输出为空...utf-8下,输出正常。 J|o )c~  
.\AbE*lZ#  
为什么呢,原因在于5.4.0对这个函数的变化: -Wl79lE  
VQ`a-DL  
5.4.0   The default value for the encoding parameter was changed to UTF-8. <o_(,,P%  
Q-f?7*>  
原来是什么呢? B#x.4~YX  
HY'-P&H5(  
string htmlspecialchars ( string $string [, int $flags = ENT_COMPAT | ENT_HTML401 [, string $encoding = 'UTF-8' [, bool $double_encode = true ]]] ) o[K,(  
+S}/ 6dg  
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. l=t$ XWh!  
3R$*G8v  
原来是ISO-8859-1,5.4后默认变成utf-8!然后中文使用这个函数就输出为空白了。 [e`6gGO  
vBjrI*0  
国内一堆开源程序在5.4下都会有这样的问题,DISCUZ官方也建议用户不要升级到5.4。 Z\*jt B:  
y[sO0u\  
解决方案: CN<EgNt1kN  
yixAG^<  
1.苦逼的修改所有用到htmlspecialchars地方的程序 =LMM]'no,  
0:4w@"Q  
1.1 其第二个$flags参数,默认是ENT_COMPAT,因此改成 H~r":A'"*  
htmlspecialchars($str,ENT_COMPAT,'GB2312'); IH~[/qNk  
为什么不是GBK?因为没有GBK这个参数,如果强行使用GBK,则报错给你看: 'z3I*[!  
Warning: htmlspecialchars(): charset `gbk' not supported, assuming utf-8 \L{V|}"X  
为了能使用GBK,则改成: ,[<+7  
htmlspecialchars($str,ENT_COMPAT,'ISO-8859-1'); c0u1L@tj  
'?MT " G  
1.2.一样是改程序,但可以省略一个参数。 +LsACSB  
可以在网页头部加 |(\T;~7'  
ini_set('default_charset','gbk'); &F#K=R| .j  
然后改成 hTVA^j(w  
htmlspecialchars($str,ENT_COMPAT,''); wxSJ  
文档中有写: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. 1A.ecv'  
大概意思就是:传入空字符串则使用default_charset的编码 =S:Snk%  
d/Y#oVI  
1.3.封装一个函数吧...本来htmlspecialchars这个单词一直不好记。 xb~8uD5  
function htmlout($str) { yRv4,{B}X>  
    return htmlspecialchars($str,ENT_COMPAT,'ISO-8859-1'); 0JM`*f%n  
} Yb;$z'  
然后去批量替换。 3r-oZ8/n  
R /0zB  
2.直接修改源码,重编译!这也是目前我在线上做的方案。 sw$$I~21  
修改ext/standard/html.c dNfME*"yN  
大概在372行 YecV+ K'p:  
/* Default is now UTF-8 */ Vx*O^cM  
if (charset_hint == NULL) pW4$$2S?9  
return cs_utf_8; R7ze~[oF  
把cs_utf_8改成 cs_8859_1 *\PCMl  
/* Default is now UTF-8 */ <Po$|$_~  
if (charset_hint == NULL) f )Ef-o  
return cs_8859_1; JsD|igqF-  
编译后,原程序就不用做任何调整了。错
 
只看该作者 安逸沙发  发表于: 2017-09-09
昨天在写 PDO数据库封装类的 测试代码时遇到这个问题,取出的数组 使用 count 返回5,使用 array_keys 返回数组,但是在 dump 的时候却返回 null,纠结了好长时间,诸如下图: s]<r  
Q()RO*9  
ji)4WG/1  
dump 函数用了好多年了,一直没有出现这个问题,我还以为是 $rowset 返回的是引用,所以还重新赋值了下, H0b6ZA%n  
我的dump函数如下: $x_52 j\j  
Php代码  收藏代码 #[0\=B -  
function dump($vars, $label = '', $return = false)   H^PqYLj N  
{       &G@-yQ  
    $content = "<pre>\n";   ~eV!!38 J  
    if ($label != '') {   .m]=JC5'  
        $content .= "<strong>{$label} :</strong>\n";   EfBVu  
    }   CX ]\Q-y  
    $content .= htmlspecialchars(print_r($vars, true));   &c<}++'h  
    $content .= "\n</pre>\n";   ks%7W -  
       _`X#c-J  
    if ($return) { return $content; }   ci_v7Jnwo  
    echo $content;   IL>/PuZku  
}   7=p-A _X  
Ad`[Rt']kI  
话说这个函数从php4.3时代就跟着我打拼,一直没出现过啥问题,.... _[{:!?-?  
+/!=Ub[:U  
最后 查了N多地方才把注意力移到这个上面,我机器上装的是 PHP5.5,我没有测试过到底是哪个版本就会出现这个问题,此处标记下,这个是坑... SC $`  
@X|i@{<';  
那行代码 改成: *e-ptgO  
Php代码  收藏代码 _D2bGZN  
$content .= htmlspecialchars(print_r($vars, true),ENT_COMPAT | ENT_IGNORE);   Zu0;/_rN  
C>:/(O  
这个,增加第二个参数 ,并追加 (+gL#/u  
Php代码  收藏代码 :B*vkwT  
| ENT_IGNORE   Vh#Mp!  
HL(U~Q6JQ  
7dlKdKH  
写道 GIRSoRVsh  
string htmlentities ( string $string [, int $flags = ENT_COMPAT [, string $charset [, bool $double_encode = true ]]] ) i (%tHa37  
{KU.  
ENT_COMPAT 将双引号换成单引号 O+E1M=R6h  
ENT_QUOTES 将转换和单引号都翻倍。 1~R$$P11[9  
ENT_NOQUOTES 将离开两双,单引号得救。 0tW<LR-}E  
ENT_IGNORE G+hF [b44'  
静静地丢弃无效代码单元序列代替返回一个空字符串。在PHP 5.3.0补充说。这是供向后兼容性,避免使用它,因为它可能的安全隐患。 >St. &#c  
ib(>vp$V  
O/D Af|X|  
支持的字符集列表 字符集 别名 描述 0~Iu7mPY  
ISO-8859-1 ISO8859-1 西欧,Latin-1 43J\8WBn@  
ISO-8859-15 ISO8859-15 西欧,Latin-9。增加欧元符号,法语和芬兰语字母在 Latin-1(ISO-8859-1) 中缺失。 dq YDz  
UTF-8 ASCII 兼容的多字节 8 位 Unicode。 M q^|M~  
cp866 ibm866, 866 DOS 特有的西里尔编码。本字符集在 4.3.2 版本中得到支持。 j!lAxlOX  
cp1251 Windows-1251, win-1251, 1251 Windows 特有的西里尔编码。本字符集在 4.3.2 版本中得到支持。 GP[6nw_'^  
cp1252 Windows-1252, 1252 Windows 特有的西欧编码。 z29qARiX  
KOI8-R koi8-ru, koi8r 俄语。本字符集在 4.3.2 版本中得到支持。 ]3O 4\o  
BIG5 950 繁体中文,主要用于中国台湾省。 e~+(7_2  
GB2312 936 简体中文,中国国家标准字符集。 yHWi [7$  
BIG5-HKSCS 繁体中文,附带香港扩展的 Big5 字符集。 IU Y> ih  
Shift_JIS SJIS, 932 日语 2gd<8a''  
EUC-JP EUCJP 日语
快速回复

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