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