简单生活
返回文章列表
462 字3 分钟

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

设计开发#PHP/JavaScript

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

打完收工。

历史留言归档

1
静态只读归档
吉
吉祥物
学习了 挺一个