UTF-16 编码简介

-- Start

其实, 所谓的编码就是字符数字之间的映射, 我们把这个数字称为代码点或码位(code point), 码位采用16进制加上前缀U+来表示, 如:A的码位是U+0041.

20世纪80年代, 人们在设计Unicode编码的时候认为, 2个字节16位65536个码位足以将世界上所有语言的字符进行编码, 码位从 U+0000 到 U+FFFF.

随着时间的发展, 在加入大量的中文, 日文和韩文之后, 不可避免的事情发生了, 65536个码位已经不能满足要求了, 所以人们将Unicode的码位从 65536 个扩展到 1114111 个, 码位从 U+0000 到 U+10FFFF.
人们又将这 1114111 个码位划分成17个平面(plane), 每个平面包含 65536 个码位, 每个平面的码位范围从U+xx0000到U+xxFFFF, 其中xx表示十六进制值从00到10,共计17个平面。

第一个平面称为基本多文种平面(Basic Multilingual Plane, BMP),或第零平面(Plane 0)。 其他平面称为辅助平面(Supplementary Planes)。

在基本多文种平面內, 从U+D800到U+DFFF之间的码位区段是永久保留不映射到字符, 因此UTF-16巧妙的利用了这保留下来的码位来对辅助平面内的字符进行编码。

在UTF-16中, 辅助平面内的字符被编码为一对16比特长的码元, 称之为代理对(surrogate pair), 第一部分称为高位代理(high surrogate)或前导代理(lead surrogates),码位从U+D800到U+DBFF. 第二部分称为低位代理(low surrogate)或后尾代理(trail surrogates), 码位从U+DC00到U+DFFF.

因此在Java中, 辅助平面内的字符需要一对char来表示, 如果你试图通过一下代码来定义一个char, 编译器会给出错误提示.

char c = '\u10FFFF';

你也不要诧异, 为什么我们可以把一个char型变量转换成int型而不需要强制转换, 事实上我们可以通过这种方式来查看它的码位.

char c = '波';
int i = c;
System.out.println(Integer.toHexString(i));

---更多参见:Java 精萃
-- 声 明:转载请注明出处
-- Last Updated on 2012-04-25
-- Written by ShangBo on 2012-04-25
-- End


没有更多推荐了,返回首页