php中escape和unescape

最近开发项目的要和delphi进行通信,其中涉及到了中文的传输导致中文为为乱码无法解析

经过本人测试,在文件格式为gbk和utf-8编码时,php在对字符进行escape的过程也是不一样的

在gbk下面:

[php]  view plain copy
  1. <?php  
  2. $str = "我是来测试的";  
  3. $enStr = escape ( $str );  
  4. echo $enStr . "<br/>";  
  5. echo '解:'.unescape( $enStr )."<br/>";  
  6. echo unescape('%u6211%u662F%u6765%u6D4B%u8BD5%u7684');  
  7.   
  8. function escape($str) {  
  9.     $sublen = strlen ( $str );  
  10.     $retrunString = "";  
  11.     for($i = 0; $i < $sublen$i ++) {  
  12.         if (ord ( $str [$i] ) >= 127) {  
  13.             $tmpString = bin2hex ( iconv ( "gb2312""ucs-2"substr ( $str$i, 2 ) ) );  
  14.             $retrunString .= "%u" . $tmpString;  
  15.             $i ++;  
  16.         } else {  
  17.             $retrunString .= "%" . dechex ( ord ( $str [$i] ) );  
  18.         }  
  19.     }  
  20.     return $retrunString;  
  21. }  
  22. function unescape($str) {  
  23.     $str = rawurldecode ( $str );  
  24.     preg_match_all ( "/%u.{4}|&#x.{4};|&#\d+;|.+/U"$str$r );  
  25.     $ar = $r [0];  
  26.     foreach ( $ar as $k => $v ) {  
  27.         if (substr ( $v, 0, 2 ) == "%u")  
  28.             $ar [$k] = iconv ( "UCS-2""GBK", pack ( "H4"substr ( $v, - 4 ) ) );  
  29.         elseif (substr ( $v, 0, 3 ) == "&#x")  
  30.             $ar [$k] = iconv ( "UCS-2""GBK", pack ( "H4"substr ( $v, 3, - 1 ) ) );  
  31.         elseif (substr ( $v, 0, 2 ) == "&#") {  
  32.             $ar [$k] = iconv ( "UCS-2""GBK", pack ( "n"substr ( $v, 2, - 1 ) ) );  
  33.         }  
  34.     }  
  35.     return join ( ""$ar );  
  36. }  
  37. ?>  
  38. <html>  
  39. <head>  
  40. <script type="text/javascript">  
  41. var str = '我是来测试的';  
  42. var enStr = escape(str);  
  43. alert(enStr+"解:"+unescape(enStr));  
  44. </script>  
  45. </head>  
  46. </html>  

在utf-8下面:

[php]  view plain copy
  1. <?php  
  2. $str = "我是来测试的";  
  3. $enStr = escape ( $str );  
  4. echo $enStr . "<br/>";  
  5. echo '解:'.unescape( $enStr )."<br/>";  
  6. echo unescape('%u6211%u662F%u6765%u6D4B%u8BD5%u7684');  
  7.   
  8. function escape($str) {  
  9.     preg_match_all ( "/[\xc2-\xdf][\x80-\xbf]+|[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xff][\x80-\xbf]{3}|[\x01-\x7f]+/e"$str$r );  
  10.     //匹配utf-8字符,   
  11.     $str = $r [0];  
  12.     $l = count ( $str );  
  13.     for($i = 0; $i < $l$i ++) {  
  14.         $value = ord ( $str [$i] [0] );  
  15.         if ($value < 223) {  
  16.             $str [$i] = rawurlencode ( utf8_decode ( $str [$i] ) );  
  17.         //先将utf8编码转换为ISO-8859-1编码的单字节字符,urlencode单字节字符.   
  18.         //utf8_decode()的作用相当于iconv("UTF-8","CP1252",$v)。   
  19.         } else {  
  20.             $str [$i] = "%u" . strtoupper ( bin2hex ( iconv ( "UTF-8""UCS-2"$str [$i] ) ) );  
  21.         }  
  22.     }  
  23.     return join ( ""$str );  
  24. }  
  25. function unescape($str) {  
  26.     $ret = '';  
  27.     $len = strlen ( $str );  
  28.     for($i = 0; $i < $len$i ++) {  
  29.         if ($str [$i] == '%' && $str [$i + 1] == 'u') {  
  30.             $val = hexdec ( substr ( $str$i + 2, 4 ) );  
  31.             if ($val < 0x7f)  
  32.                 $ret .= chr ( $val );  
  33.             else if ($val < 0x800)  
  34.                 $ret .= chr ( 0xc0 | ($val >> 6) ) . chr ( 0x80 | ($val & 0x3f) );  
  35.             else  
  36.                 $ret .= chr ( 0xe0 | ($val >> 12) ) . chr ( 0x80 | (($val >> 6) & 0x3f) ) . chr ( 0x80 | ($val & 0x3f) );  
  37.             $i += 5;  
  38.         } else if ($str [$i] == '%') {  
  39.             $ret .= urldecode ( substr ( $str$i, 3 ) );  
  40.             $i += 2;  
  41.         } else  
  42.             $ret .= $str [$i];  
  43.     }  
  44.     return $ret;  
  45. }  
  46. ?>  
  47. <html>  
  48. <head>  
  49. <script type="text/javascript">  
  50. var str = '我是来测试的';  
  51. var enStr = escape(str);  
  52. alert(enStr+"解:"+unescape(enStr));  
  53. </script>  
  54. </head>  
  55. </html>  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值