在json中不支持中文,用它传送中文数据就会出现数据丢失或者乱码,必须在传送前对要发送的字符串进行编码,由于传送过去需要用js进行数据解析,考虑 到js中有unescape函数,故若在php中有个escape函数,对数据进行编码,在客户端用unescape进行 解码,这样就会方便很多。
本文给大家分享一个PHP解密Unicode及Escape加密字符串函数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
<?php function uni_decode( $s ) { preg_match_all( '/\&\#([0-9]{2,5})\;/' , $s , $html_uni ); preg_match_all( '/[\\\%]u([0-9a-f]{4})/ie' , $s , $js_uni ); $source = array_merge ( $html_uni [0], $js_uni [0]); $js = array (); for ( $i =0; $i < count ( $js_uni [1]); $i ++) { $js [] = hexdec( $js_uni [1][ $i ]); } $utf8 = array_merge ( $html_uni [1], $js ); $code = $s ; for ( $j =0; $j < count ( $utf8 ); $j ++) { $code = str_replace ( $source [ $j ], unicode2utf8( $utf8 [ $j ]), $code ); } return $code ; //$s;//preg_replace('/\\\u([0-9a-f]{4})/ie', "chr(hexdec('\\1'))", $s); } function unicode2utf8( $c ) { $str = "" ; if ( $c < 0x80) { $str .= chr ( $c ); } else if ( $c < 0x800) { $str .= chr (0xc0 | $c >>6); $str .= chr (0x80 | $c & 0x3f); } else if ( $c < 0x10000) { $str .= chr (0xe0 | $c >>12); $str .= chr (0x80 | $c >>6 & 0x3f); $str .= chr (0x80 | $c & 0x3f); } else if ( $c < 0x200000) { $str .= chr (0xf0 | $c >>18); $str .= chr (0x80 | $c >>12 & 0x3f); $str .= chr (0x80 | $c >>6 & 0x3f); $str .= chr (0x80 | $c & 0x3f); } return $str ; } $str = '%u5927%u5BB6%u597D%uFF0C我是孤魂!<br />\u8FD9\u662F\u6D4B\u8BD5\u6587\u672C\uFF01' ; echo uni_decode( $str ); // 大家好,我是孤魂!这是测试文本! |
在网上搜索一把,很多用php实现的escape函数,大同小异
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
function phpescape( $str ){ preg_match_all( "/[\x80-\xff].|[\x01-\x7f]+/" , $str , $newstr ); $ar = $newstr [0]; foreach ( $ar as $k => $v ){ if (ord( $ar [ $k ])>=127){ $tmpString =bin2hex(iconv( "GBK" , "ucs-2" , $v )); if (! eregi ( "WIN" ,PHP_OS)){ $tmpString = substr ( $tmpString ,2,2). substr ( $tmpString ,0,2); } $reString .= "%u" . $tmpString ; } else { $reString .= rawurlencode( $v ); } } return $reString ; } |
以上所述就是本文的全部内容了,希望大家能够喜欢。