例如:
%u957f%u6c99
%u9752%u5c9b...
...
这些是什么编码啊??如何将中文字,转变成这种编码啊?

解决方案 »

  1.   

    传送门http://topic.csdn.net/u/20100623/10/6ad4b68e-d255-497d-b263-ba095a5bd847.html讨论很详细了
      

  2.   


    <?php
    class StrFormat_Ascii{
    static function encode($var){
    $ascii = '';
    $strlen_var = strlen($var);
    for ($c = 0; $c < $strlen_var; ++$c) { $ord_var_c = ord($var{$c}); switch (true) {
    case $ord_var_c == 0x08:
    $ascii .= '\b';
    break;
    case $ord_var_c == 0x09:
    $ascii .= '\t';
    break;
    case $ord_var_c == 0x0A:
    $ascii .= '\n';
    break;
    case $ord_var_c == 0x0C:
    $ascii .= '\f';
    break;
    case $ord_var_c == 0x0D:
    $ascii .= '\r';
    break; case $ord_var_c == 0x22:
    case $ord_var_c == 0x2F:
    case $ord_var_c == 0x5C:
    $ascii .= '\\'.$var{$c};
    break; case (($ord_var_c >= 0x20) && ($ord_var_c <= 0x7F)):
    $ascii .= $var{$c};
    break; case (($ord_var_c & 0xE0) == 0xC0):
    $char = pack('C*', $ord_var_c, ord($var{$c + 1}));
    $c += 1;
    $utf16 = self::utf82utf16($char);
    $ascii .= sprintf('\u%04s', bin2hex($utf16));
    break; case (($ord_var_c & 0xF0) == 0xE0):
    $char = pack('C*', $ord_var_c,
     ord($var{$c + 1}),
     ord($var{$c + 2}));
    $c += 2;
    $utf16 = self::utf82utf16($char);
    $ascii .= sprintf('\u%04s', bin2hex($utf16));
    break; case (($ord_var_c & 0xF8) == 0xF0):
    $char = pack('C*', $ord_var_c,
     ord($var{$c + 1}),
     ord($var{$c + 2}),
     ord($var{$c + 3}));
    $c += 3;
    $utf16 = self::utf82utf16($char);
    $ascii .= sprintf('\u%04s', bin2hex($utf16));
    break; case (($ord_var_c & 0xFC) == 0xF8):
    $char = pack('C*', $ord_var_c,
     ord($var{$c + 1}),
     ord($var{$c + 2}),
     ord($var{$c + 3}),
     ord($var{$c + 4}));
    $c += 4;
    $utf16 = self::utf82utf16($char);
    $ascii .= sprintf('\u%04s', bin2hex($utf16));
    break; case (($ord_var_c & 0xFE) == 0xFC):
    $char = pack('C*', $ord_var_c,
     ord($var{$c + 1}),
     ord($var{$c + 2}),
     ord($var{$c + 3}),
     ord($var{$c + 4}),
     ord($var{$c + 5}));
    $c += 5;
    $utf16 = self::utf82utf16($char);
    $ascii .= sprintf('\u%04s', bin2hex($utf16));
    break;
    }
    } return $ascii;
    }

    static function decode($var){
    $chrs = $var;
    $utf8 = '';
    $strlen_chrs = strlen($chrs); for ($c = 0; $c < $strlen_chrs; $c++) { $substr_chrs_c_2 = substr($chrs, $c, 2);
    $ord_chrs_c = ord($chrs{$c}); switch (true) {
    case $substr_chrs_c_2 == '\b':
    $utf8 .= chr(0x08);
    ++$c;
    break;
    case $substr_chrs_c_2 == '\t':
    $utf8 .= chr(0x09);
    ++$c;
    break;
    case $substr_chrs_c_2 == '\n':
    $utf8 .= chr(0x0A);
    ++$c;
    break;
    case $substr_chrs_c_2 == '\f':
    $utf8 .= chr(0x0C);
    ++$c;
    break;
    case $substr_chrs_c_2 == '\r':
    $utf8 .= chr(0x0D);
    ++$c;
    break; case $substr_chrs_c_2 == '\\"':
    case $substr_chrs_c_2 == '\\\'':
    case $substr_chrs_c_2 == '\\\\':
    case $substr_chrs_c_2 == '\\/':
    if (($delim == '"' && $substr_chrs_c_2 != '\\\'') ||
       ($delim == "'" && $substr_chrs_c_2 != '\\"')) {
    $utf8 .= $chrs{++$c};
    }
    break; case preg_match('/\\\u[0-9A-F]{4}/i', substr($chrs, $c, 6)):
    $utf16 = chr(hexdec(substr($chrs, ($c + 2), 2)))
       . chr(hexdec(substr($chrs, ($c + 4), 2)));
    $utf8 .= self::utf162utf8($utf16);
    $c += 5;
    break; case ($ord_chrs_c >= 0x20) && ($ord_chrs_c <= 0x7F):
    $utf8 .= $chrs{$c};
    break; case ($ord_chrs_c & 0xE0) == 0xC0:
    $utf8 .= substr($chrs, $c, 2);
    ++$c;
    break; case ($ord_chrs_c & 0xF0) == 0xE0:
    $utf8 .= substr($chrs, $c, 3);
    $c += 2;
    break; case ($ord_chrs_c & 0xF8) == 0xF0:
    $utf8 .= substr($chrs, $c, 4);
    $c += 3;
    break; case ($ord_chrs_c & 0xFC) == 0xF8:
    $utf8 .= substr($chrs, $c, 5);
    $c += 4;
    break; case ($ord_chrs_c & 0xFE) == 0xFC:
    $utf8 .= substr($chrs, $c, 6);
    $c += 5;
    break; } } return $utf8;
    } static function utf82utf16($utf8){
            if(function_exists('mb_convert_encoding')) {
                return mb_convert_encoding($utf8, 'UTF-16', 'UTF-8');
            }        switch(strlen($utf8)) {
                case 1:
                    return $utf8;            case 2:
                    return chr(0x07 & (ord($utf8{0}) >> 2))
                         . chr((0xC0 & (ord($utf8{0}) << 6))
                             | (0x3F & ord($utf8{1})));            case 3:
                    return chr((0xF0 & (ord($utf8{0}) << 4))
                             | (0x0F & (ord($utf8{1}) >> 2)))
                         . chr((0xC0 & (ord($utf8{1}) << 6))
                             | (0x7F & ord($utf8{2})));
            }
            return '';
    }

    static function utf162utf8($utf16){
            if(function_exists('mb_convert_encoding')) {
                return mb_convert_encoding($utf16, 'UTF-8', 'UTF-16');
            }
            $bytes = (ord($utf16{0}) << 8) | ord($utf16{1});
            switch(true) {
                case ((0x7F & $bytes) == $bytes):
                    return chr(0x7F & $bytes);            case (0x07FF & $bytes) == $bytes:
                    return chr(0xC0 | (($bytes >> 6) & 0x1F))
                         . chr(0x80 | ($bytes & 0x3F));            case (0xFFFF & $bytes) == $bytes:
                    return chr(0xE0 | (($bytes >> 12) & 0x0F))
                         . chr(0x80 | (($bytes >> 6) & 0x3F))
                         . chr(0x80 | ($bytes & 0x3F));
            }
            return '';
        }
    }
    ?>
      

  3.   

    这个应是unicode码$s = iconv('gbk', 'ucs-2', '丹东');
    echo join('%u', str_split(array_pop(unpack('H*0', $s)), 4));老大的代码第一部:转成二字节unicode
    第二步:取unicode的四位16进制码
      

  4.   


    dingsongtao大哥太厉害了!! 感谢!
      

  5.   

    你看二楼的吧我贴的是版主代码基本思想是你要先转unicode。但有多种转法,你的字串编码,文件编码。不知道二楼的是否能自动识别编码?
      

  6.   

    $s = iconv('gbk', 'ucs-2', '丹东');
    echo join('%u', str_split(array_pop(unpack('H*0', $s)), 4));这种方式是可以的哈。也更简便。
    注意到iconv的地方就可以了。我发的是从以前的json.class.php里提取出来的。
    只是因为它更稳定更原始,所以一直用的它。