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);
打完收工。