Unicode原理和互转中文
代码点
Unicode标准的本意很简单:希望给世界上每一种文字系统的每一个字符,都分配一个唯一的整数,这些整数叫做代码点(Code Points)。
代码空间
所有的代码点构成一个代码空间(Code Space),根据Unicode定义,总共有1,114,112个代码点,编号从0x0到0x10FFFF。换句话说,如果每个代码点都能够代表一个有效字符的话,Unicode标准最多能够编码1,114,112,也就是大概110多万个字符。最新的Unicode标准(7.0)已经给超过11万个字符分配了代码点。
代码平面
Unicode标准把代码点分成了17个代码平面(Code Plane),编号为#0到#16。
每个代码平面包含65,536(2^16)个代码点(17*65,536=1,114,112)。
其中,Plane#0叫做基本多语言平面(Basic Multilingual Plane,BMP),其余平面叫做补充平面(Supplementary Planes)。
Unicode7.0只使用了17个平面中的6个,并且给这6个平面起了名字,如下
public String getChineseByunicode(String sunicode) { char a; int len = sunicode.length(); StringBuffer outBuffer = new StringBuffer(len); for (int b = 0; b < len; ) { a = sunicode.charAt(b++); if (a == '\\') { a = sunicode.charAt(b++); if (a == 'u') { int value = 0; for (int i = 0; i < 4; i++) { a = sunicode.charAt(b++); switch (a) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': value = (value << 4) + a - '0'; break; case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': value = (value << 4) + 10 + a - 'a'; break; case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': value = (value << 4) + 10 + a - 'A'; break; default: throw new IllegalArgumentException( "Malformed \\uxxxx encoding."); } } outBuffer.append((char) value); } else { if (a == 't') a = '\t'; else if (a == 'r') a = '\r'; else if (a == 'n') a = '\n'; else if (a == 'f') a = '\f'; outBuffer.append(a); } } else outBuffer.append(a); } return outBuffer.toString(); }
------------------------- A little Progress a day makes you a big success... ----------------------------