答案在javadoc中:
char数据类型(以及因此Character对象封装的值)基于原始Unipre规范,该规范将字符定义为固定宽度的16位实体。此后,对Unipre标准进行了更改,以允许其表示需要超过16位的字符。
合法代码点的范围现在为U + 0000到U + 10FFFF,即Unipre标量值。(请参阅Unipre标准中U + n表示法的定义。)从U +
0000到U + FFFF的字符集有时被称为基本多语言平面(BMP)。代码点大于U + FFFF的字符称为补充字符。Java
2平台在char数组以及String和StringBuffer类中使用UTF-16表示形式。在此表示形式中,辅助字符表示为一对char值,第一个字符来自高代理范围(
uD800- uDBFF),第二个字符来自低代理范围( uDC00- uDFFF)。因此,char值表示基本多语言平面(BMP)代码点,包括代理代码点或UTF-16编码的代码单元。一个int值表示所有Unipre代码点,包括补充代码点。int的低21位(最低有效)用于表示Unipre代码点,高11位(最高有效)必须为零。
除非另有说明,否则有关补充字符和替代char值的行为如下:仅接受char值的方法不能支持补充字符。他们将代理范围中的char值视为未定义字符。例如,Character.isLetter(’
uD840’)返回false,即使该特定值(如果在字符串中后接任何低替代值都表示一个字母)也是如此。接受int值的方法支持所有Unipre字符,包括补充字符。例如,Character.isLetter(0x2F81A)返回true,因为代码点值表示字母(CJK表意文字)。在Java
SE API文档中,Unipre代码点用于U + 0000到U +
10FFFF之间的字符值,Unipre代码单元用于16位char值,这些值是UTF-16编码的代码单元。有关Unipre术语的更多信息,请参阅Unipre术语表。
简单地说:
- char规则的16位是为Unipre标准的旧版本设计的
- 您有时需要两个字符来表示基本多语言平面中没有的Unipre符文(代码点)。这种“有效”的方法是因为您不经常使用字符,尤其是在BMP之外处理Unipre符文。
更简单的说:
- Java字符不代表Unipre代码点(嗯,并非总是如此)。
顺便说一句,可以注意到,Unipre的扩展超出了BMP,这使得UTF-16在全球范围内变得无关紧要,因为UTF-16甚至没有启用固定的字节/字符比率。这就是为什么更多现代语言基于UTF-8的原因。此宣言有助于理解它。



