简单生活

Simple life , it's as easy as 1,2,3...

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

中文字符在JSON中是无法处理的,使用的后果一定是乱码伺候,通常我们用JavaScript的escape函数对中文进行编码转换,比如cookie中的用户名。

有些情况下,为了保持程序的一致性,我们需要在PHP中对中文字符进行escape编码,而PHP本身是没有escape函数的,于是便诞生了一些PHP中的自定义函数实现escape编码。

PHP代码复制内容到剪贴板
  1. function phpescape($str){  
  2.     $sublen=strlen($str);  
  3.     $reString="";  
  4.     for ($i=0;$i<$sublen;$i++){  
  5.         if(ord($str[$i])>=127){  
  6.             $tmpString=bin2hex(iconv("GBK","ucs-2",substr($str,$i,2)));    //此处GBK为目标代码的编码格式,请实际情况修改  
  7.             if (!eregi("WIN",PHP_OS)){  
  8.                 $tmpString=substr($tmpString,2,2).substr($tmpString,0,2);  
  9.             }  
  10.             $reString.="%u".$tmpString;  
  11.             $i++;  
  12.         } else {  
  13.             $reString.="%".dechex(ord($str[$i]));  
  14.         }  
  15.     }  
  16.     return $reString;  
  17. }  

上面被我成功用在phpcms2008的ucenter api接口文件中,解决了我的一个不大不小的问题。

phpcms2008(v9已经发布了,为了区分,先把版本号写上,后面还是用简称)使用ucenter与其他程序整合后,从其他程序同步登陆到phpcms,顶部用户名会出现乱码。而从phpcms登陆则没有这个问题。

查看了相关源码,发现在phpcms中用户登陆是使用 images/js/common.js 中的setcookie函数来设置cookie,而同步登陆是使用 api/uc.php 设置cookie,80行找到以下代码:

PHP代码复制内容到剪贴板
  1. set_cookie('username'$member->escape($arr['username']), $cookietime);  

这里直接在PHP中使用JavaScript中的escape函数,但是PHP没有escape函数可以使用,这就是导致从其他程序同步登陆后,phpcms的cookie中用户名并没有经过escape编码,从而出现乱码。

可以把上面的函数加入上 api/uc.php 中,加在这行错误代码前就好,然后把这行代码修改为:

PHP代码复制内容到剪贴板
  1. set_cookie('username', phpescape($arr['username']), $cookietime);  

打完收工。

« 2010年度个人豆瓣统计将ucenter事件导入Discuz! X1.5家园 »

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关注我

最新评论及回复

赞助商链接

Powered By Z-Blog 1.8 Walle Build 91204
Copyright © 2007-2011 Wilf.cn. Some Rights Reserved