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