洒家偶遇如下一函数,从未接触过。
第一,是PHP中哪方面的知识?文件处理吗?还是二进制?
第二,请从头到末注解一番。为何要用过00XX,内存码。
function js_unescape($str)    
{    
    $ret = '';    
    $len = strlen($str);    
    for ($i = 0; $i < $len; $i++)    
    {    
        if ($str[$i] == '%' && $str[$i+1] == 'u')    
        {    
            $val = hexdec(substr($str, $i+2, 4));    
            if ($val < 0x7f) $ret .= chr($val);    
            else if($val < 0x800) $ret .= chr(0xc0|($val>>6)).chr(0x80|($val&0x3f));    
            else $ret .= chr(0xe0|($val>>12)).chr(0x80|(($val>>6)&0x3f)).chr(0x80|($val&0x3f));    
            $i += 5;    
        }    
        else if ($str[$i] == '%')    
        {    
            $ret .= urldecode(substr($str, $i, 3));    
            $i += 2;    
        }    
        else $ret .= $str[$i];    
    }    
    return $ret;    
}  

解决方案 »

  1.   

    1、只涉及字符串操作和位运算
    2、0xhh 是十六进制计数,不是什么“内存码”
    因为涉及位运算,所以选择十六进制计数比较直观,用十进制计数时需要在大脑里有个数制变换过程,有点伤神
    3、%uhhhh 是 unicode 编码系列中的 ucs-2 的 HTML 实体表示,因为我们都是在中文环境中工作
    所以也就简洁的称作unicode了
    他与 utf-8 间,存在简单的位移对应关系:
    U+007F  0xxxxxxx
    U+07FF  110xxxxx 10xxxxxx
    U+FFFF  1110xxxx 10xxxxxx 10xxxxxx你的这个函数就是实现从 unicode 到 utf-8 的编码转换的过程原理清楚了,代码也就能看懂了
      

  2.   

    解码,算是php版的unescape(js)
    js中escape方法返回一个包含了charstring内容的字符串值(Unicode格式)所有空格、标点、重音符号以
    及其他非ASCII字符都用%xx编码代替,其中xx等于表示该字符的十六进制数。例如,空格返回的是"%20"
    字符值大于255的以%uxxxx格式存储。

    大于0x7f是汉字,高位为1,按位操作,最核心操作就是对汉字解码
    0x800我也没看懂,及向右平移6位与或非就出来个东西,是得专门想想啊,谁能给详解一个汉字的编码操作啊
      

  3.   

    本帖最后由 xuzuning 于 2012-10-24 11:05:13 编辑