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。編碼規則如下
如果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。

