【问题标题】:In java what's different between Character.isBmpCodePoint and Character.isValidCodePoint在java中 Character.isBmpCodePoint 和 Character.isValidCodePoint 有什么不同
【发布时间】:2021-11-08 20:12:08
【问题描述】:

在java中Character.isBmpCodePointCharacter.isValidCodePoint有什么不同?

我的意思是,我知道0x10FFFF0xFFFF,但这意味着什么?我应该使用哪个?

【问题讨论】:

  • BMP:基本多语言平面,所以码位从0到65535(注意:并非所有码位都有效)
  • @FredSuvn 感谢您对问题的澄清。现在我的答案显然太短了,我想扩展它。但这需要一些时间,正如在 cmets 中已经看到的那样,有很多东西需要学习。此外,维基百科有很多关于该主题的信息。我希望我能够对它进行概述。

标签: java unicode codepoint


【解决方案1】:

基本多语言平面 (BMP) 是 Unicode (see Wikipedia) 中合法代码点的子集。

但是让我们看看官方文档。

isValidCodePoint

如果指定的代码点值介于 MIN_CODE_POINT 和 MAX_CODE_POINT 之间,则为 true;否则为假。

  • MIN_CODE_POINT: U+0000
  • MAX_CODE_POINT: U+10FFFF

isBmpCodePoint

如果指定的代码点介于 MIN_VALUE 和 MAX_VALUE 之间,则为 true;否则为假。

  • MIN_VALUE: '\u0000'
  • MAX_VALUE: '\uFFFF'

文档在此处对类型的用法有点混乱,但很容易看出包含上限不同,0xFFFF 低于 10FFFF。

【讨论】:

  • 还应该注意的是,Unicode 的最早版本被设计为 16 位字符编码(即没有它今天所具有的可扩展性,并且仅限于大约 64k 个字符)。这就是为什么 unicode 的早期采用者会做一些有问题的事情,比如简单地将 char_t 替换为 wchar_t(即假设 16 位对每个人来说都足够了)。而那些“低 16 位”现在构成了 BMP。 IE。这是每个人都支持的部分,甚至是旧的Unicode软件。超出此范围的字符点需要“现代”软件。 Unicode 2.0 是取消 16 位限制的时候。
  • @JoachimSauer 感谢您的评论。 25 年前做一些 Java 时,我(来自 C/C++ 背景)了解到char 只是一个 16 位实体。如果这是真的:今天的 Java 是如何处理这种可扩展性的,也许是 UTF-16?
  • a char 在 Java 中根本无法保存所有 Unicode 代码点,因此它实际上是一个 UTF-16 代码点。 String 处理“UTF-16”编码,并有提到 *codePoint* 的方法,这些方法在查找和处理 UTF-16 代理并将它们转换为适当的代码点方面做得很糟糕。基本上只要你不使用char 并且只使用String 它就会由Java 为你处理(这实际上并不像听起来那么难)。这也是上述两种方法采用int 而不是char 的原因。
  • 请注意,IsValidCodePoint() 有点误导,因为并非0x0000..0x10FFFF 范围内的所有数值实际上都是有效的代码点。该范围内的许多值要么是保留的,要么是未定义的。如果您只关心将整数编码为 UTF-16,IsValidCodePoint() 很好,但对于实际的文本验证,您需要考虑 Unicode 认为对文本目的无效的代码点,而 IsValidCodePoint() 不会帮助你。
  • 一个不言而喻的事实是,Java 中的 char 类型是遗留的,并且基本上被破坏了。当逐个字符单独工作时,使用code point 整数,而不是char。细读CharacterStringStringBuilder 等API,查看多年来添加的各种…codePoint… 方法。当您的应用遇到无法用char 值表示的大部分 Unicode 字符之一时,在您的代码中使用char 是一种很好的方式,可以在以后的生产中引发令人抓狂的错误。
猜你喜欢
  • 2015-10-22
  • 2015-02-20
  • 2013-11-18
  • 2011-11-03
  • 2010-10-07
  • 1970-01-01
  • 1970-01-01
  • 2011-05-22
  • 2015-11-04
相关资源
最近更新 更多