摘要
- 1.概念
- 2.擷取方法
- 3.代碼點與代碼單元的代碼示例
1.概念
代碼點(code point):與一個編碼表中的某個字元對應的代碼值.
在Unicode标準中,代碼點采用十六進制書寫,并加上字首U+,
例U+0041就是字母A的代碼點.
Unicode的代碼點可以分成17個代碼級别(code plane).
第一個代碼級别成為基本的多語言級别,代碼點從U+0000到U+FFFF,其中包括了經典的Unicode代碼.
其餘的16個附加級别,代碼點從U+10000到U+10FFFF,其中包括了一些輔助字元(增補字元).
關于增補字元的具體描述請看:關于Java增補字元
增補字元是用一個長度為2的char數組表示的,分别表示高代理項和低代理項。
代碼單元(code unit):在第一代碼級别中,每個字元用16位表示(即代碼單元);而輔助字元采用一對連續的代碼單元進行編碼.
UTF-16編碼采用不同長度的編碼表示所有的Unicode代碼點.
通俗了解 :
代碼點 : Unicode中的各個字元
代碼單元 : 若一個字元的代碼長度為16位,則為一個代碼單元;若一個字元的代碼長度有兩個16的代碼長度編碼,則該字元有兩個代碼單元.
Unicode(代碼點) | 常用字元 | 輔助字元 |
數量(代碼單元) | 一個代碼單元 | 一對代碼單元 |
(圖檔來源:char 碼點和代碼單元)
在Java中一個Unicode占2個位元組(byte)
一個位元組等于8比特位(bit)
是以,每個Unicode碼占用16個比特位
2.擷取方法
String.length()方法 :
傳回采用UTF-16編碼表示的給定字元串所需要的代碼單元數量.
String.codePointCount(int beginIndex, int endIndex) :
傳回此String指定文本範圍内的Unicode代碼點數.
String.charAt(int index) :
傳回位置index的代碼單元,n介于0~String.length()-1之間.
3.代碼點與代碼單元的代碼示例
從Unicode字元百科裡面找到U+10000以後的一個字元進行試驗.
public class CodePointDemo {
public static void main(String[] args) {
String str = "?";
System.out.println(str.length());// 輸出該字元串的代碼單元的數量
System.out.println(str.codePointCount(0, str.length()));// 輸出該字元串的代碼點數
System.out.println(Integer.toHexString(str.charAt(0)));// 先獲得該字元第一個位置的代碼單元的char類型字元,編譯器先将char類型強轉為int類型的值,後将int值轉換為16進制數進行輸出
System.out.println(Integer.toHexString(str.charAt(1)));//
System.out.println("\ud801\udcd1");// 将兩個char類型字元輸出組成了一個代碼點?
}
}
/*輸出:
2
1
d801
dcd1
?
*/
Integer.toHexString(str.charAt(0))
需要注意,該代碼用到了強轉
關于強轉的詳細資訊,請看:
首先,str.charAt(0)傳回一個char類型字元,Integer.toHexString(int i)接受一個int類型的值,故需要先将char強轉為int,在完成該代碼.