utf8、utf16、utf32之間的格式


https://baike.baidu.com/item/Unicode

這篇百度百科中講解了utf8的格式、utf16的格式。

utf8的編碼格式:

Unicode編碼(十六進制) 
UTF-8 字節流(二進制)
000000-00007F
0xxxxxxx
000080-0007FF
110xxxxx 10xxxxxx
000800-00FFFF
1110xxxx 10xxxxxx 10xxxxxx
010000-10FFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

  UTF-8的特點是對不同范圍的字符使用不同長度的編碼。對於0x00-0x7F之間的字符,UTF-8編碼與 ASCII編碼完全相同。UTF-8編碼的最大長度是4個字節。 從上表可以看出,4字節模板有21個x,即可以容納21位二進制數字。 Unicode的最大碼位0x10FFFF也只有21位
  例1:“漢”字的Unicode編碼是0x6C49。0x6C49在0x0800-0xFFFF之間, 使用3字節模板:1110xxxx 10xxxxxx 10xxxxxx。將0x6C49寫成二進制是:0110 1100 0100 1001, 用這個比特流依次代替模板中的x,得到:11100110 10110001 10001001,即E6 B1 89。
  例2:Unicode編碼0x20C30在0x010000-0x10FFFF之間, 使用4字節模板:11110xxx 10xxxxxx 10xxxxxx 10xxxxxx。將0x20C30寫成21位二進制數字(不足21位就在前面補0):0 0010 0000 1100 0011 0000,用這個比特流依次代替模板中的x,得到:11110000 10100000 10110000 10110000,即F0 A0 B0 B0。
utf16的編碼格式:
D800-DB7F
High Surrogates
高位替代
DB80-DBFF
High Private Use Surrogates
高位專用替代
DC00-DFFF
Low Surrogates
低位替代

UTF-16編碼以16位無符號整數為單位。我們把Unicode編碼記作U。編碼規則如下

unicode
   如果U<0x10000,U的UTF-16編碼就是U對應的16位無符號整數(為書寫簡便,下文將16位無符號整數記作WORD)。
   如果U≥0x10000,我們先計算U'=U-0x10000,然后將U'寫成二進制形式:yyyy yyyy yyxx xxxx xxxx,U的UTF-16編碼(二進制)就是:110110yyyyyyyyyy 110111xxxxxxxxxx。
  為什么U'可以被寫成20個二進制位?Unicode的最大碼位是0x10FFFF,減去0x10000后,U'的最大值是0xFFFFF,所以肯定可以用20個 二進制位表示。例如:Unicode編碼0x20C30,減去0x10000后,得到0x10C30,寫成二進制是:0001 0000 1100 0011 0000。用前10位依次替代模板中的y,用后10位依次替代模板中的x,就得到:1101100001000011 1101110000110000,即0xD843 0xDC30。

  按照上述規則,Unicode編碼0x10000-0x10FFFF的UTF-16編碼有兩個WORD,第一個WORD的高6位是110110,第二個WORD的高6位是110111。可見,第一個WORD的取值范圍(二進制)是11011000 00000000到11011011 11111111,即0xD800-0xDBFF。第二個WORD的取值范圍(二進制)是11011100 00000000到11011111 11111111,即0xDC00-0xDFFF。

關於這個之間的轉換可以借鑒cjson源碼中utf16轉換為utf8。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM