一、UTF-16编码方法
Unicode是国际组织制定的可以容纳世界上所有文字和符号的字符编码方案。Unicode用数值0x000000-0x10FFFF来映射这些字符,最多可以容纳1114112个字符,或者说有1114112个代码点(code point)。代码点就是字符对应数值加上前缀U+,如U+0041就是字母A的代码点。UTF-8、UTF-16、UTF-32都是将数字转换到程序数据的转换格式。
1 代码点在U+0000到U+FFFF(注意U+D800到U+DBFF无定义)之间的字符(也叫做BMP, Basic Multilingual Plane),直接用两个字节表示。
2 代码点在U+10000到U+10FFFF(共有0xFFFFF个字符)之间的字符(也叫做增补字符集, supplementary characters),需要用四个字节表示。
前两个字节的范围是U+D800到U+DBFF(也叫高代理项, high-surrogates range),
后两个字节的范围是U+DC00到U+DFFF(也叫低代理项, low-surrogates range)。
转换方式如下:
2.1 将代码点对应数值减去0x10000,结果范围0x0000到0xFFFFF。
2.2 将结果的高10bit与0xD800做逻辑或运算,低10bit与0xDC00做逻辑或运算,
2.3 将两部分组合起来就是该字符值的UTF-16编码。
3 根据存储顺序的不同,UTF-16分为UTF-16LE和UTF-16BE,Windows和Linux一般使用UTF-16LE,而苹果操作系统使用UTF-16BE。
二、Java中的UTF-16
0 在JDK1.5之后Java才开始支持增补字符集,由JSR 204(Unicode Supplementary Character Support)实现。
1 Java中使用char(两个字节)作为表示字符的代码单元(code unit)。因此,Java中单个char是无法表示增补字符的,而且位于U+D800到U+DBFF和U+DC00到U+DFFF的char被视为无定义字符。
2 在Jav