Java如何以其16位char类型存储UTF-16字符?

根据Java SE

7规范,Java使用Unicode

UTF-16标准表示字符。将a想象String成一个 简单 的16位变量 数组 ,每个 数组 包含一个字符时,生活很简单。

不幸的是,对于某些代码点来说,仅16位是不够的(我相信这是所有Unicode字符的16/17)。因此在a中String,这没有直接问题,因为当要使用

另外两个字节 存储〜1.048.576个字符之一时,只需使用其中的两个数组位置String

这,不构成任何 直接的 问题,适用于StringS,因为不可能永远是一个额外的两个字节。尽管相对于UTF-16编码, 固定长度为16位的

单个变量来说,如何存储这些字符,特别是Java如何使用其 2字节的“字符”来实现呢?类型

回答:

答案在javadoc中:

char数据类型(以及因此Character对象封装的值)基于原始Unicode规范,该规范将字符定义为固定宽度的16位实体。此后,对Unicode标准进行了更改,以允许其表示需要超过16位的字符。

合法代码点的范围现在为U + 0000到U + 10FFFF,即Unicode标量值。(请参阅Unicode标准中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值表示所有Unicode代码点,包括补充代码点。int的低21位(最低有效)用于表示Unicode代码点,高11位(最高有效)必须为零。

除非另有说明,否则有关补充字符和替代char值的行为如下:仅接受char值的方法不能支持补充字符。他们将代理范围中的char值视为未定义字符。例如,Character.isLetter(’\

uD840’)返回false,即使该特定值(如果在字符串中后接任何低替代值都表示一个字母)也是如此。接受int值的方法支持所有Unicode字符,包括补充字符。例如,Character.isLetter(0x2F81A)返回true,因为代码点值表示字母(CJK表意文字)。在Java

SE API文档中,Unicode代码点用于U + 0000到U +

10FFFF之间的字符值,Unicode代码单元用于16位char值,这些值是UTF-16编码的代码单元。有关Unicode术语的更多信息,请参阅Unicode术语表。

简单地说:

  • char规则的16位是为Unicode标准的旧版本设计的
  • 您有时需要两个字符来表示基本多语言平面中没有的Unicode符文(代码点)。这种“有效”的方法是因为您不经常使用字符,尤其是在BMP之外处理Unicode符文。

更简单的说:

  • Java字符不代表Unicode代码点(嗯,并非总是如此)。

顺便说一句,可以注意到,Unicode的扩展超出了BMP,这使得UTF-16在全球范围内变得无关紧要,因为UTF-16甚至没有启用固定的字节/字符比率。这就是为什么更多现代语言基于UTF-8的原因。此宣言有助于理解它。

以上是 Java如何以其16位char类型存储UTF-16字符? 的全部内容, 来源链接: utcz.com/qa/414130.html

回到顶部