2020国产成人精品视频,性做久久久久久久久,亚洲国产成人久久综合一区,亚洲影院天堂中文av色

分享

utf8的編碼算法

 Ralf_Jones 2006-07-12
utf8的編碼算法
         unicode字符集是我們世界上最完善最全面的字符集,幾乎包含了世界上所有的字符。其實(shí)可以這么理解,unicode字符集是一張巨大的表格,把世界上各種語言的字符和標(biāo)點(diǎn)符號(hào)都編排到里面,然后按照一定的順序給每個(gè)字符排號(hào)(很遺憾的是對(duì)于中文來說,這個(gè)順序不是按照漢語拼音的順序)。有了這張巨大的表格,世界上大部分字符就都有一個(gè)unicode內(nèi)碼(整數(shù))來對(duì)應(yīng)。計(jì)算機(jī)就通過記錄字符的unicode碼來表示這個(gè)字符,然后交給操作系統(tǒng),操作系統(tǒng)通過unicode碼到字符字體點(diǎn)陣的映射把這個(gè)內(nèi)碼轉(zhuǎn)換成字體點(diǎn)陣顯示到我們的屏幕上。
       
         utf8是我們常用的編碼方式,在web開發(fā)中使用utf8編碼能完全解決字符集問題。其實(shí)utf8是unicode字符集的一種物理實(shí)現(xiàn),它描述了如何高效的存儲(chǔ)unicode的內(nèi)碼(就是上面說的字符在字符集的順序碼),RFC2044文檔(http: //www.ietf.org/rfc/rfc2044.txt?number=2044)描述了如何從一個(gè)內(nèi)碼轉(zhuǎn)換成utf8格式的算法。英文不好沒關(guān)系,看這個(gè)轉(zhuǎn)換表就會(huì)馬上明白了:

   UCS-4 range (hex.)           UTF-8 octet sequence (binary)
   0000 0000-0000 007F   0xxxxxxx
   0000 0080-0000 07FF   110xxxxx 10xxxxxx
   0000 0800-0000 FFFF   1110xxxx 10xxxxxx 10xxxxxx
   0001 0000-001F FFFF   11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
   0020 0000-03FF FFFF   111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
   0400 0000-7FFF FFFF   1111110x 10xxxxxx ... 10xxxxxx

         上面的表格左邊是16進(jìn)制表示的unicode內(nèi)碼,最后一行的16進(jìn)制數(shù)“7FFF FFFF”是utf8所能表示的內(nèi)碼的最大值,換成10進(jìn)制是這樣的一個(gè)數(shù):2147483647(夠大吧:))[對(duì)不起,此文最初這兒寫錯(cuò)了,已改正]。上面表格中右邊一列就是utf8的二進(jìn)制格式,轉(zhuǎn)換規(guī)則可謂一目了然。我直接給出算法吧(js代碼):


    function toUtf8(code)
    {
     var iByte=0;
     var i=0;
     result="";
     while(code>0x7f)
     {
      iByte=code%0x40;
      code=(code-iByte)/0x40;
      result="%"+(iByte|0x80).toString(16).toUpperCase()+result;
      i++;
     }
     prefix=[0x0,0xc0,0xe0,0xf0,0xf8,0xfc];
     if(i>prefix.length)
     {
      i=5;
     }
     result=""+(code|prefix[i]).toString(16).toUpperCase()+result;
     return result;
    }
        


          例如字符"漢"的unicode是6C49,把這個(gè)unicode字符表示為一個(gè)大整數(shù),然后轉(zhuǎn)變成多字節(jié)編碼110110001001001:
          觀察這個(gè)整數(shù)的二進(jìn)制碼序列(110,110001,001001)
          從后往前取
          如果這個(gè)二進(jìn)制序列只有后7位(小于128,也就是ascii字符)則直接取后7位二進(jìn)制數(shù)形成一個(gè)utf8字符。
          上面的字符“漢”二進(jìn)制序列大于7位,所以取后6位(1001001),加10形成一個(gè)utf8字節(jié)(10 001001 ,16進(jìn)制89)。
          剩下的二進(jìn)制序列(110,110001)從后向前取6位,加10形成一個(gè)utf8字節(jié)(10 110001,16進(jìn)制B1)。
          剩下的二進(jìn)制序列(110)從后向前取6位,由于不足6位,將這個(gè)數(shù)和1110000相或,得到字符11100110,16進(jìn)制E6
          最后,就得到了utf8編碼,16進(jìn)制表示為E6B189

           【應(yīng)用領(lǐng)域】
           雖然這種標(biāo)準(zhǔn)算法大部分已經(jīng)由開發(fā)工具提供商或者庫實(shí)現(xiàn),但是我們依然會(huì)在某些時(shí)候需要自己實(shí)現(xiàn)這種算法:
           某些瀏覽器(ie5)不支持encodeURI函數(shù),那么使用ajax提交漢字有兩種方案:
                 漢字字符經(jīng)escape轉(zhuǎn)變成形如"%uXXXX"的字符,服務(wù)端使用上述算法將u后面的unicode序號(hào)轉(zhuǎn)變成utf8字符
                 使用上面的算法結(jié)合escape直接在客戶端實(shí)現(xiàn)encodeURI功能(推薦使用這種方案)

            實(shí)現(xiàn)json-rpc服務(wù)
            json是javascript的對(duì)象直接量形式,其中字符串必須是unicode字符,漢字需要轉(zhuǎn)換成"\uXXXX"的形式。所以我們需要把服務(wù)端字符進(jìn)行json轉(zhuǎn)變。對(duì)于php來說,現(xiàn)在有兩個(gè)開源項(xiàng)目JSON-PHP 和 PHP-JSON。
            json-rpc是一種以json為數(shù)據(jù)格式的rpc協(xié)議,可以方便應(yīng)用與ajax項(xiàng)目中,是一個(gè)開源的實(shí)現(xiàn)。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多