PHP 自定义函数实现 JavaScript escape 编码

中文字符在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);

打完收工。