在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 ;
}
|
以上所述就是本文的全部内容了,希望大家能够喜欢。