首先說一下char類型:
char類型用來表示單個字符。要想弄清楚char類型,就必須了解Unicode編碼表。
在設計Java時決定采用16位的Unicode字符集。能表示65536個字符。
十分遺憾,經過一段時間,不可避免的事情發生了。Unicode字符超過了65536個。
(主要原因是增加了大量的漢語、日語、韓語這樣的表意文字),也就是16位的char類型已經不能滿足所有的Unicode字符的需要了。
代碼點(code point):是指與一個編碼表中的某個字符對應的代碼值。
在Unicode標准中,代碼點采用十六進制書寫,並加上前綴U+,例如U+0041就是字母A的代碼點。
Unicode的代碼點可以分成17個代碼級別(code plane).
第一個代碼級別成為 基本的多語言級別(basic multilingual plane),代碼點從U+0000大U+FFFF,其中包含了經典的Unicode代碼。
其余的16個附加級別代碼點從U+10000到U+10FFFF,其中包括了一些輔助字符(supplementary character)。
UTF-16編碼采用不同長度的編碼表示所有Unicode代碼點。在基本的多語言級別中,每個字符用16位表示,通常被稱為代碼單元(code unit)。而輔助字符采用一對連續的代碼單元進行編碼。
Java中得代碼點與代碼單元:
Java字符串由char序列組成。字符數據類型是一個采用UTF-16編碼表示Unicode代碼點的代碼單元。
大多數的常用Unicode字符使用一個代碼單元就可以表示,而輔助字符需要一對代碼單元表示。
length方法將返回采用UTF-16編碼表示的給定字符串所需要的代碼單元數量。
String greeting = "Hello";
int n = greeting.length(); //is 5
要想得到實際的長度,即代碼點數量,可以調用:
int cpCount = greeting.codePointCount(0, greeting.length());
摘自《Java核心技術》卷I 下載見 http://www.linuxidc.com/Linux/2011-10/44569.htm