当前位置: 首页 > 面试题库 >

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

秦权
2023-03-14
问题内容

根据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的原因。此宣言有助于理解它。



 类似资料:
  • 问题内容: 最近,我阅读了很多有关Unicode代码点的信息,以及它们随着时间的演变,并确保我也阅读了http://www.joelonsoftware.com/articles/Unicode.html。 但是我找不到真正的原因是Java为什么将UTF-16用作字符。 例如,如果我的字符串包含1024个ASCII范围的字母。这意味着等于2KB的字符串内存,它将以任何方式消耗。 因此,如果Java

  • 问题内容: 我试图理解Java中的字符编码。Java中的字符使用UTF-16编码以16位存储。因此,当我将包含6个字符的字符串转换为字节时,我将得到如下所示的6个字节,但我希望它是12。是否缺少任何概念? O / p:字符数组的长度为6 根据@Darshan尝试使用UTF-16编码获取字节时,结果也不期望。 问题答案: 在UTF-16版本中,由于插入了一个标记来区分Big Endian(默认)和L

  • 我试图理解Java中的字符编码。Java中的字符使用UTF-16编码以16位存储。因此,当我将一个包含6个字符的字符串转换为字节时,我得到了6个字节,如下所示,我期望它是12。我是不是漏掉了什么概念? O/p:字符数组的长度为6 按照@Darshan的说法,当尝试使用UTF-16编码获取字节时,结果也不是预期的。

  • 问题内容: Java的char是16位,但是Unicode具有更多的字符-Java如何处理呢? 问题答案: Java字符串是UTF-16(大端),因此Unicode代码点可以是一个或两个字符。在这种编码下,Java可以使用chars (字符串文字)来表示代码点U + 1D50A( 数学上的FRAKTUR CAPITAL G )。的字符类提供了用于从码点转换为/方法。

  • 问题内容: 该JSON RFC,第2.5节,说部分: 为了转义不在“基本多语言平面”中的扩展字符,该字符表示为十二个字符的序列,对UTF-16代理对进行编码。因此,例如,仅包含G谱号字符(U + 1D11E)的字符串可以表示为“ \ uD834 \ uDD1E”。 假设我有合理的理由将JSON编码为UTF-16BE(允许)。这样做时,是否仍然需要转义基本多语言平面中没有的字符?例如,代替此: 这是

  • 我有一个文件,当用geanny显示时*显示UTF-16BE。如果我尝试将这个Java文件转换为不同的编码(假设它是UTF-16BE),那么一个问号(?)每次在新建文件的开头出现。相反,如果我假设它是在UTF-16中(这不是真的),转换后的文件就可以转换了,在开头没有任何问号。有谁能澄清为什么会有这种行为吗?