char 是 Java 的八大基本數據類型之一,字長 16 bit。
Java 的字符編碼標準是 Unicode。如今 Unicode 的字符數已經超過了216(65536),一個 char 類型不能直接表示所有的字符。為了解決這個問題,Java 采用了如下的機制。
1. 定義了“代碼點(code point)”。這實際上就是編碼表中的碼值。用U+XXXX的方式表示。
2. 定義了“代碼單元(code unit)”。每 16 個 bit 就是一個代碼單元(一個 char 變量就可以裝下了)。
3. 通過一個算法,將代碼單元映射到代碼點。由于有些字符的編碼范圍大于65536,因此,會使用兩個代碼單元來表示一個代碼點。
具體是這樣的:
Unicode 的代碼點被分為 17 個代碼級別:
1. 基本的多語言級別(basic multilingual plane,共 1 個級別)。范圍是 U+0000 ~ U+FFFF。位于基本多語言級別中的字符被稱為基本字符。在 Java 中,基本字符采用一個代碼單元進行編碼。
2. 附加級別(supplymental plane,共 16 個級別)。范圍是 U+10000 ~ U+10FFFF。位于附加級別中的字符被稱為輔助字符。在 Java 中,它采用一對連續的代碼單元進行編碼。
3. 在基本的多語言級別中,有2048個特殊的編碼(也占用一個代碼單元)。它們不表示任何字符,而是用于兩兩組,以產生附加級別的代碼點。也就是2種用到的代碼單元編碼。(如果不單獨使用特殊編碼,程序又如何能夠區分何時使用基本字符,何時使用附加字符?)
4. U+D800 ~ U+DBFF用于第一個代碼單元,U+DC00 ~ U+DFFF用于第二個代碼單元。
例:U+D835和U+DD6B表示U+1D56B