天天看點

代碼點和代碼單元的了解-Java

摘要

  • ​​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,其中包括了一些輔助字元(增補字元).

​增補字元是用一個長度為2的char數組表示的,分别表示高代理項和低代理項。​

​ 關于增補字元的具體描述請看:關于Java增補字元

代碼單元(code unit):在第一代碼級别中,每個字元用16位表示(即代碼單元);而輔助字元采用一對連續的代碼單元進行編碼.

UTF-16編碼采用不同長度的編碼表示所有的Unicode代碼點.

通俗了解 :

代碼點 : Unicode中的各個字元

代碼單元 : 若一個字元的代碼長度為16位,則為一個代碼單元;若一個字元的代碼長度有兩個16的代碼長度編碼,則該字元有兩個代碼單元.

Unicode(代碼點) 常用字元 輔助字元
數量(代碼單元) 一個代碼單元 一對代碼單元
代碼點和代碼單元的了解-Java

(圖檔來源:​​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,在完成該代碼.