·您当前的位置:首页 > 技术教程 > JavaScript >

[PHP]php中escape函数加密与JS中unescape解密

时间:2014-07-11 08:19酷播
在json中不支持中文,用它传送中文数据就会出现数据丢失或者乱码,必须在传送前对要发送的字符串进行编码,由于传送过去需要用js进行数据解析,考虑 到js中有unescape函数,故若在php中有个escape函数,对数据进行编码,在客户端用unescape进行 解码,这样就会方便很多

在json中不支持中文,用它传送中文数据就会出现数据丢失或者乱码,必须在传送前对要发送的字符串进行编码,由于传送过去需要用js进行数据解析,考虑 到js中有unescape函数,故若在php中有个escape函数,对数据进行编码,在客户端用unescape进行 解码,这样就会方便很多。

先在网上搜索一把,很多用php实现的escape函数,大同小异

  1. function phpescape($str){ 
  2.     preg_match_all("/[\x80-\xff].|[\x01-\x7f]+/",$str,$newstr); 
  3.     $ar = $newstr[0]; 
  4.     foreach($ar as $k=>$v){ 
  5.         if(ord($ar[$k])>=127){ 
  6.             $tmpString=bin2hex(iconv("GBK","ucs-2",$v)); 
  7.             if (!eregi("WIN",PHP_OS)){ 
  8.                 $tmpString = substr($tmpString,2,2).substr($tmpString,0,2); 
  9.             } 
  10.             $reString.="%u".$tmpString; 
  11.         } else { 
  12.             $reString.rawurlencode($v); 
  13.         } 
  14.     } 
  15.     return $reString; 
  16. }  



这个函数可以很好的工作,但是,也许有新手不理解这个函数的原理(比如我),用起来总是不放心,现在我就来解释一下这个函数的原理。而且我认为,拿别人的代码来复用,好比站在了巨人的肩膀上,但是若不理解别人的代码,迟早要掉到地面上。

第一句:preg_match_all("/[\x80-\xff].|[\x01-\x7f]+/",$str,$r);这个是用正则表达式匹 配字符串中所有的字符,[\x80-\xff]. 匹配的是汉字,\x表示匹配字符的16进制编码,[ ] 是类选择符,“.” 表示任意一个字符,这样[\x80-\xff].匹配的是两个字符,其中第一个就是16进制从80到ff的字符,而这恰好就是汉字编码的第一个字符。这样 就能完整的匹配一个汉字。关于unicode中汉字的编码,大家可以到网上搜索一下。同理,[\x01-\x7f]+英文字符串,因为最早的英文是 ASCII编码,编码值小于128,也就是16进制的从01到7f,"+"表示一个或者多个字符,这样[\x01-\x7f]+就能匹配连续多个英文字符 串。

$ar = $r[0];             //$r[0]里存放是匹配到的数组
  foreach($ar as $k=>$v) {
    if(ord($v[0]) < 128)                 //假如字符编码值小于128,说明是个英文字符
      $ar[$k] = rawurlencode($v);    //直接用rawurlencode编码
    else
      $ar[$k] = "%u".bin2hex(iconv("GB2312","UCS-2",$v));    //否则的话用iconv函数把汉字转变成ucs-2编码,也就是unicode编码
  }

这个就是关于php中escape函数的一个实现,欢迎大家补充

有时候可能会遇到PHP版本不同,导致出来结果不同,以致于乱码
下面这个备用

php提供的URL编码函数是基于字节的,对由ie的javascript函数escape编码的数据就无能为力了。
因此在此共享本人的php版的escape/unescape函数

一个加密一个解密的

  1. function escape($str) { 
  2.   preg_match_all("/[\x80-\xff].|[\x01-\x7f]+/",$str,$r); 
  3.   $ar = $r[0]; 
  4.   foreach($ar as $k=>$v) { 
  5.     if(ord($v[0]) < 128
  6.       $ar[$k] = rawurlencode($v); 
  7.     else 
  8.       $ar[$k] = "%u".bin2hex(iconv("GB2312","UCS-2",$v)); 
  9.   } 
  10.   return join("",$ar); 
  11.  
  12. function unescape($str) { 
  13.   $str = rawurldecode($str); 
  14.   preg_match_all("/(?:%u.{4})|.+/",$str,$r); 
  15.   $ar = $r[0]; 
  16.   foreach($ar as $k=>$v) { 
  17.     if(substr($v,0,2) == "%u" && strlen($v) == 6) 
  18.       $ar[$k] = iconv("UCS-2","GB2312",pack("H4",substr($v,-4))); 
  19.   } 
  20.   return join("",$ar); 

 

热门文章推荐

请稍候...

保利威视云平台-轻松实现点播直播视频应用

酷播云数据统计分析跨平台播放器