1
<? |
002 | /** |
003 | * 将字符串转换成unicode编码 |
004 | * |
005 | * @param string $input |
006 | * @param string $input_charset |
007 | * @return string |
008 | */ |
009 | function str_to_unicode( $input , $input_charset = 'gbk' ){ |
010 | $input = iconv( $input_charset , "gbk" , $input ); |
011 | preg_match_all( "/[x80-xff]?./" , $input , $ar ); |
012 | $b = array_map ( 'utf8_unicode_' , $ar [0]); |
013 | $outstr = join( "" , $b ); |
014 |
015 | return $outstr ; |
016 | } |
017 |
018 | function utf8_unicode_( $c , $input_charset = 'gbk' ) { |
019 | $c = iconv( $input_charset , 'utf-8' , $c ); |
020 | return utf8_unicode( $c ); |
021 | } |
022 |
023 | // utf8 -> unicode |
024 | function utf8_unicode( $c ) { |
025 | switch ( strlen ( $c )) { |
026 | case 1: |
027 | return $c ; |
028 | case 2: |
029 | $n = (ord( $c [0]) & 0x3f) << 6; |
030 | $n += ord( $c [1]) & 0x3f; |
031 | break ; |
032 | case 3: |
033 | $n = (ord( $c [0]) & 0x1f) << 12; |
034 | $n += (ord( $c [1]) & 0x3f) << 6; |
035 | $n += ord( $c [2]) & 0x3f; |
036 | break ; |
037 | case 4: |
038 | $n = (ord( $c [0]) & 0x0f) << 18; |
039 | $n += (ord( $c [1]) & 0x3f) << 12; |
040 | $n += (ord( $c [2]) & 0x3f) << 6; |
041 | $n += ord( $c [3]) & 0x3f; |
042 | break ; |
043 | } |
044 |
045 | return "&#$n;" ; |
046 | } |
047 |
048 | /** |
049 | * 将unicode字符转换成普通编码字符 |
050 | * |
051 | * @param string $str |
052 | * @param string $out_charset |
053 | * @return string |
054 | */ |
055 | function str_from_unicode( $str , $out_charset = 'gbk' ) { |
056 | $str = preg_replace_callback( "|&#([0-9]{1,5});|" , 'unicode2utf8_' , $str ); |
057 | $str = iconv( "UTF-8" , $out_charset , $str ); |
058 | return $str ; |
059 | } |
060 |
061 | function unicode2utf8_( $c ) { |
062 | return unicode2utf8( $c [1]); |
063 | } |
064 | function unicode2utf8( $c ){ |
065 | $str = "" ; |
066 | if ( $c < 0x80) { |
067 | $str .= $c ; |
068 | } else if ( $c < 0x800) { |
069 | $str .= chr (0xC0 | $c >>6); |
070 | $str .= chr (0x80 | $c & 0x3F); |
071 | } else if ( $c < 0x10000) { |
072 | $str .= chr (0xE0 | $c >>12); |
073 | $str .= chr (0x80 | $c >>6 & 0x3F); |
074 | $str .= chr (0x80 | $c & 0x3F); |
075 | } else if ( $c < 0x200000) { |
076 | $str .= chr (0xF0 | $c >>18); |
077 | $str .= chr (0x80 | $c >>12 & 0x3F); |
078 | $str .= chr (0x80 | $c >>6 & 0x3F); |
079 | $str .= chr (0x80 | $c & 0x3F); |
080 | } |
081 |
082 | return $str ; |
083 | } |
084 |
085 | /** |
086 | * 模拟JS里的unescape |
087 | * |
088 | * @param unknown_type $str |
089 | * @return unknown |
090 | */ |
091 | function unescape( $str ) { |
092 | $str = rawurldecode( $str ); |
093 | preg_match_all( "/(?:%u.{4})|.{4};|&#d+;|.+/U" , $str , $r ); |
094 | $ar = $r [0]; |
095 | #print_r( $ar ); |
096 | foreach ( $ar as $k => $v ) { |
097 | if ( substr ( $v ,0,2) == "%u" ) |
098 | $ar [ $k ] = iconv( "UCS-2" , "GB2312" ,pack( "H4" , substr ( $v ,-4))); |
099 | elseif ( substr ( $v ,0,3) == "" ) |
100 | $ar [ $k ] = iconv( "UCS-2" , "GB2312" ,pack( "H4" , substr ( $v ,3,-1))); |
101 | elseif ( substr ( $v ,0,2) == "&#" ) { |
102 | echo substr ( $v ,2,-1). "" ; |
103 | $ar [ $k ] = iconv( "UCS-2" , "GB2312" ,pack( "n" , substr ( $v ,2,-1))); |
104 | } |
105 | } |
106 | return join( "" , $ar ); |
107 | } |
108 | ?> |
根据上面提供的资料,项目中实战如下:
前端用JS函数 “ encodeURIComponent ” 编码,服务端用下面这个自定义PHP函数解码:
01 | /** 模拟JS里的unescape |
02 | * |
03 | * @param unknown_type $str |
04 | */ |
05 | function unescape( $str , $charset = 'utf-8' ) { |
06 | $str = rawurldecode( $str ); |
07 | preg_match_all( "/(?:%u.{4})|.{4};|&#d+;|.+/U" , $str , $r ); |
08 | $ar = $r [0]; |
09 | foreach ( $ar as $k => $v ) { |
10 | if ( substr ( $v ,0,2) == "%u" ) |
11 | $ar [ $k ] = iconv( "UCS-2" , $charset , pack( "H4" , substr ( $v ,-4))); |
12 | elseif ( substr ( $v , 0, 3) == "" ) |
13 | $ar [ $k ] = iconv( "UCS-2" , $charset , pack( "H4" , substr ( $v , 3, -1))); |
14 | elseif ( substr ( $v ,0,2) == "&#" ) { |
15 | echo substr ( $v ,2,-1) . "" ; |
16 | $ar [ $k ] = iconv( "UCS-2" , $charset , pack( "n" , substr ( $v , 2, -1))); |
17 | } |
18 | } |
19 |
20 | return join( "" , $ar ); |
21 | } |
服务端解码:
1 | $firstName = urldecode(trim( $POST ( 'firstName' ))); |
2 | $firstName = unescape( $firstName ); |