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中除去四字节编码的那块部分的编码方案。