天天看點

utf-8格式、utf-16格式

utf-8的格式如下

注意:x代表0或1的數值。範圍字段是以16進制,編碼形式字段是以2進制給出

範圍                                        編碼形式

0x00000000-0x0000007F     0xxxxxxx

0x00000080-0x000007FF     110xxxxx,10xxxxxx

0x00000800-0x0000FFFF     1110xxxx,10xxxxxx,10xxxxxx

0x00010000-0x0010FFFF     11110xxx,10xxxxxx,10xxxxxx,10xxxxxx

utf-16的格式如下

範圍                                        編碼形式

0x00000000-0x0000FFFF      xxxxxxxx,xxxxxxxx

0x00010000-0x0010FFFF      110110xx,xxxxxxxx,110111xx,xxxxxxxx

0x00010000-0x0010FFFF範圍是将字元原始表示減去0x00010000再進行編碼,使用了0xD800,0xDC00做為代理,将前一步得到的結果的高10bit和低10bit分别與0xD800和0xDC00進行或運算,得到高字,和低字,最後拼接起來。

為了能夠在一堆都是用兩個位元組表示的utf-16的字元中能夠識别4個位元組的utf-16的字元,我們規定如果看到兩個位元組的值在0xD800-0xDCFF之間,我們就認為這兩個位元組和後面兩個位元組才能構成一個字元。這樣的話,我們把2位元組的utf-16的0xD800-0xDCFF區域專門用作代理了,這也是代理的的由來。這個區域中的含義如下:

0xD800-0xDB7F是高位替代

0xDB80-0xDBFF是高位專用替代

0xDC00-0xDCFF是低位替代

其中高位專用替代是專門用來表示0xf0000-0x10ffff範圍的字元,也就是平面15和平面16,也成為專用區,是以這個高位成為高位專用替代

而utf中有大尾序和小尾序之分,也稱為大端序和小端序。

大尾序中高位元組放在低位址(前面),低位元組放放到高位址(後面)

假如得到的結果是0xD950 0xDF21:

大尾序中:         0xD950 0xDF21

小尾序中:         0x50D9 0x21DF

這裡主要是如果你是将utf16編碼的字元寫到一個位元組緩沖區中,需要注意大小端序。

如果是儲存在wchar_t數組中則無需調換高位元組和低位元組的順序。

另外我們說的ucs2是utf-16的子集,是utf-16中除去四位元組編碼的那塊部分的編碼方案。