中文字符在JSON中是无法处理的,使用的后果一定是乱码伺候,通常我们用JavaScript的escape函数对中文进行编码转换,比如cookie中的用户名。
有些情况下,为了保持程序的一致性,我们需要在PHP中对中文字符进行escape编码,而PHP本身是没有escape函数的,于是便诞生了一些PHP中的自定义函数实现escape编码。
function phpescape($str){ $sublen=strlen($str); $reString=""; for ($i=0;$i<$sublen;$i++){ if(ord($str[$i])>=127){ $tmpString=bin2hex(iconv("GBK","ucs-2",substr($str,$i,2))); //此处GBK为目标代码的编码格式,请实际情况修改 if (!eregi("WIN",PHP_OS)){ $tmpString=substr($tmpString,2,2).substr($tmpString,0,2); } $reString.="%u".$tmpString; $i++; } else { $reString.="%".dechex(ord($str[$i])); } } return $reString; }
上面被我成功用在phpcms2008的ucenter api接口文件中,解决了我的一个不大不小的问题。
phpcms2008(v9已经发布了,为了区分,先把版本号写上,后面还是用简称)使用ucenter与其他程序整合后,从其他程序同步登陆到phpcms,顶部用户名会出现乱码。而从phpcms登陆则没有这个问题。
查看了相关源码,发现在phpcms中用户登陆是使用 images/js/common.js 中的setcookie函数来设置cookie,而同步登陆是使用 api/uc.php 设置cookie,80行找到以下代码:
set_cookie(‘username’, $member->escape($arr[‘username’]), $cookietime);
这里直接在PHP中使用JavaScript中的escape函数,但是PHP没有escape函数可以使用,这就是导致从其他程序同步登陆后,phpcms的cookie中用户名并没有经过escape编码,从而出现乱码。
可以把上面的函数加入上 api/uc.php 中,加在这行错误代码前就好,然后把这行代码修改为:
set_cookie(‘username’, phpescape($arr[‘username’]), $cookietime);
打完收工。
学习了 挺一个