utf8的編碼演算法

2021-04-13 05:55:37 字數 1694 閱讀 1697

unicode字符集是我們世界上最完善最全面的字符集,幾乎包含了世界上所有的字元。其實可以這麼理解,unicode字符集是一張巨大的**,把世界上各種語言的字元和標點符號都編排到裡面,然後按照一定的順序給每個字元排號(很遺憾的是對於中文來說,這個順序不是按照漢語拼音的順序)。有了這張巨大的**,世界上大部分字元就都有乙個unicode內碼(整數)來對應。計算機就通過記錄字元的unicode碼來表示這個字元,然後交給作業系統,作業系統通過unicode碼到字元字型點陣的對映把這個內碼轉換成字型點陣顯示到我們的螢幕上。

utf8是我們常用的編碼方式,在web開發中使用utf8編碼能完全解決字符集問題。其實utf8是unicode字符集的一種物理實現,它描述了如何高效的儲存unicode的內碼(就是上面說的字元在字符集的順序碼),rfc2044文件(http: //www.ietf.org/rfc/rfc2044.txt?number=2044)描述了如何從乙個內碼轉換成utf8格式的演算法。英文不好沒關係,看這個轉換表就會馬上明白了:

ucs-4 range (hex.)           utf-8 octet sequence (binary)

0000 0000-0000 007f   0******x

0000 0080-0000 07ff   110***xx 10******

0000 0800-0000 ffff   1110***x 10****** 10******

0001 0000-001f ffff   11110*** 10****** 10****** 10******

0020 0000-03ff ffff   111110xx 10****** 10****** 10****** 10******

0400 0000-7fff ffff   1111110x 10****** ... 10******

上面的**左邊是16進製表示的unicode內碼,最後一行的16進製制數「7fff ffff」是utf8所能表示的內碼的最大值,換成10進製是這樣的乙個數:2147483647(夠大吧:))[對不起,此文最初這兒寫錯了,已改正]。上面**中右邊一列就是utf8的二進位制格式,轉換規則可謂一目了然。我直接給出演算法吧(js**):

function toutf8(code)

prefix=[0x0,0xc0,0xe0,0xf0,0xf8,0xfc];

if(i>prefix.length)

result=""+(code|prefix[i]).tostring(16).touppercase()+result;

return result;

}例如字元"漢"的unicode是6c49,把這個unicode字元表示為乙個大整數,然後轉變成多位元組編碼110110001001001:

觀察這個整數的二進位製碼序列(110,110001,001001)

從後往前取

如果這個二進位制序列只有後7位(小於128,也就是ascii字元)則直接取後7位二進位制數形成乙個utf8字元。

上面的字元「漢」二進位制序列大於7位,所以取後6位(1001001),加10形成乙個utf8位元組(10 001001 ,16進製制89)。

剩下的二進位制序列(110,110001)從後向前取6位,加10形成乙個utf8位元組(10 110001,16進製制b1)。

剩下的二進位制序列(110)從後向前取6位,由於不足6位,將這個數和1110000相或,得到字元11100110,16進製制e6

最後,就得到了utf8編碼,16進製表示為e6b189

介紹utf8編碼

utf8並不算是一種電腦編碼,而是一種儲存和傳送的格式,如前所述,每個unicode ucs字元都以 2或4個bytes來儲存,看看以下的比較 以 i am chinese 為例 用ansi儲存 12 bytes 用unicode ucs2儲存 24 bytes 2 bytes header 用uc...

UTF8編碼 解碼

參考文件 rfc3629標準.對於任意乙個字,都可以用乙個唯一碼 unicode碼,由標準編制 表示,在應用過程中,需要對碼進行編碼.常用的編碼方式為utf 8.utf 8採用類似於ip位址分配的機制.即對於不同範圍的unicode碼,採用不同的模板進行編碼.流程概述為 2.1 查表獲取unicod...

UTF 8的編碼方式

utf編碼 utf 8就是以8位為單元對ucs進行編碼。從ucs 2到utf 8的編碼方式如下 ucs 2編碼 16進製制 utf 8 位元組流 二進位制 0000 007f 0 x 0080 07ff 110 xx 10 0800 ffff 1110 x 10 10 例如 漢 字的unicode編...