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 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 | <? /** * 将字符串转换成unicode编码 * * @param string $input * @param string $input_charset * @return string */ function str_to_unicode( $input , $input_charset = 'gbk' ){ $input = iconv( $input_charset , "gbk" , $input ); preg_match_all( "/[x80-xff]?./" , $input , $ar ); $b = array_map ( 'utf8_unicode_' , $ar [0]); $outstr = join( "" , $b ); return $outstr ; } function utf8_unicode_( $c , $input_charset = 'gbk' ) { $c = iconv( $input_charset , 'utf-8' , $c ); return utf8_unicode( $c ); } // utf8 -> unicode function utf8_unicode( $c ) { switch ( strlen ( $c )) { case 1: return $c ; case 2: $n = (ord( $c [0]) & 0x3f) << 6; $n += ord( $c [1]) & 0x3f; break ; case 3: $n = (ord( $c [0]) & 0x1f) << 12; $n += (ord( $c [1]) & 0x3f) << 6; $n += ord( $c [2]) & 0x3f; break ; case 4: $n = (ord( $c [0]) & 0x0f) << 18; $n += (ord( $c [1]) & 0x3f) << 12; $n += (ord( $c [2]) & 0x3f) << 6; $n += ord( $c [3]) & 0x3f; break ; } return "&#$n;" ; } /** * 将unicode字符转换成普通编码字符 * * @param string $str * @param string $out_charset * @return string */ function str_from_unicode( $str , $out_charset = 'gbk' ) { $str = preg_replace_callback( "|&#([0-9]{1,5});|" , 'unicode2utf8_' , $str ); $str = iconv( "UTF-8" , $out_charset , $str ); return $str ; } function unicode2utf8_( $c ) { return unicode2utf8( $c [1]); } function unicode2utf8( $c ){ $str = "" ; if ( $c < 0x80) { $str .= $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 ; } /** * 模拟JS里的unescape * * @param unknown_type $str * @return unknown */ function unescape( $str ) { $str = rawurldecode( $str ); preg_match_all( "/(?:%u.{4})|.{4};|&#d+;|.+/U" , $str , $r ); $ar = $r [0]; #print_r( $ar ); foreach ( $ar as $k => $v ) { if ( substr ( $v ,0,2) == "%u" ) $ar [ $k ] = iconv( "UCS-2" , "GB2312" ,pack( "H4" , substr ( $v ,-4))); elseif ( substr ( $v ,0,3) == "" ) $ar [ $k ] = iconv( "UCS-2" , "GB2312" ,pack( "H4" , substr ( $v ,3,-1))); elseif ( substr ( $v ,0,2) == "&#" ) { echo substr ( $v ,2,-1). "" ; $ar [ $k ] = iconv( "UCS-2" , "GB2312" ,pack( "n" , substr ( $v ,2,-1))); } } return join( "" , $ar ); } ?> |
根据上面提供的资料,项目中实战如下:
前端用JS函数 “ encodeURIComponent ” 编码,服务端用下面这个自定义PHP函数解码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | /** 模拟JS里的unescape * * @param unknown_type $str */ function unescape( $str , $charset = 'utf-8' ) { $str = rawurldecode( $str ); preg_match_all( "/(?:%u.{4})|.{4};|&#d+;|.+/U" , $str , $r ); $ar = $r [0]; foreach ( $ar as $k => $v ) { if ( substr ( $v ,0,2) == "%u" ) $ar [ $k ] = iconv( "UCS-2" , $charset , pack( "H4" , substr ( $v ,-4))); elseif ( substr ( $v , 0, 3) == "" ) $ar [ $k ] = iconv( "UCS-2" , $charset , pack( "H4" , substr ( $v , 3, -1))); elseif ( substr ( $v ,0,2) == "&#" ) { echo substr ( $v ,2,-1) . "" ; $ar [ $k ] = iconv( "UCS-2" , $charset , pack( "n" , substr ( $v , 2, -1))); } } return join( "" , $ar ); } |
服务端解码:
1 2 | $firstName = urldecode(trim( $POST ( 'firstName' ))); $firstName = unescape( $firstName ); |