java utf16 encoding

Unicode的码空间从U+0000到U+10FFFF
UTF16分为17个多文种平面(multilingual plane),其中基本多文种平面的范围是0x0000-0xFFFF,其他的成为辅助文本平面.
基本多文种平面的每个编码对应一个字符,或称作代码元,特殊的情况是:
U+D800到U+DFFF之间的码位区段是永久保留不映射到字符,因此UTF-16利用保留下来的0xD800-0xDFFF区段的码位来对辅助平面的字符的码位进行编码。

从u+10000到u+10ffff的码位
辅助平面(Supplementary Planes)中的码位,在UTF-16中被编码为一对16比特长的码元(即32bit,4Bytes),称作 code units called a 代理对(surrogate pair), 具体方法是:
    码位减去0x10000, 得到的值的范围为20比特长的0..0xFFFFF.
    高位的10比特的值(值的范围为0..0x3FF)被加上0xD800得到第一个码元或称作高位代理(high surrogate), 值的范围是0xD800..0xDBFF. 由于高位代理比低位代理的值要小,所以为了避免混淆使用,Unicode标准现在称高位代理为前导代理(lead surrogates).
    低位的10比特的值(值的范围也是0..0x3FF)被加上0xDC00得到第二个码元或称作低位代理(low surrogate), 现在值的范围是0xDC00..0xDFFF. 由于低位代理比高位代理的值要大,所以为了避免混淆使用,Unicode标准现在称低位代理为后尾代理(trail surrogates).






由于高位代理、低位代理、BMP中的有效字符的码位,三者互不重叠,搜索是简单的: 一个字符编码的一部分不可能与另一个字符编码的不同部分相重叠。这意味着UTF-16是自同步(self-synchronizing): 可以通过仅检查一个码元就可以判定给定字符的下一个字符的起始码元. UTF-8也有类似优点,但许多早期的编码模式就不是这样,必须从头开始分析文本才能确定不同字符的码元的边界.(这是因为所有从u+10000到u+10ffff的码位全都表示成了一对16比特长的码元,而前一个码元落在0xD800..0xDBFF,后一个码元落在0xDC00..0xDFFF.所以,只要你发现有一个码元处于0xD800..0xDfFF,那么这个码元一定是UTF16编码的一个部分,而且你能确定他是高位代理或者是低位代理.)

你可能感兴趣的:(encoding)