1

https://docs.oracle.com/en/ja...

Java 版本与 Unicode 版本对应关系

Java releaseUnicode version
Java SE 15Unicode 13.0
Java SE 13Unicode 12.1
Java SE 12Unicode 11.0
Java SE 11Unicode 10.0
Java SE 9Unicode 8.0
Java SE 8Unicode 6.2
Java SE 7Unicode 6.0
Java SE 5.0Unicode 4.0
Java SE 1.4Unicode 3.0
JDK 1.1Unicode 2.0
JDK 1.0.2Unicode 1.1.5

Unicode 一致性

char 类型以及封装类 java.lang.Character 的字段和方法是根据 Unicode 标准中的字符信息定义的,特别是作为 Unicode 字符数据库一部分的 UnicodeData文件。此文件为每个分配的 Unicode 代码点或字符范围指定属性,包括名称和类别。该文件可从 Unicode 联盟 http://www.unicode.org 获得。

Unicode 字符表示

char数据类型(以及对象封装的值 )Character基于原始 Unicode 规范,该规范将字符定义为固定宽度的 16 位实体。此后,Unicode 标准已更改为允许表示需要超过 16 位的字符。合法码点的范围现在是 U+0000 到 U+10FFFF,称为Unicode scalar value。(请参阅Unicode 标准中 U+ n符号 的 定义。)

从 U+0000 到 U+FFFF 的字符集有时称为基本多语言平面 (BMP)。 码位大于 U+FFFF 的字符称为补充字符。Java 平台在 char 数组和 String 和 StringBuffer 类中使用 UTF-16 表示。在此表示中,补充字符表示为一对 char 值,第一个来自高代理(high-surrogates) 范围 (\uD800-\uDBFF),第二个来自 低代理(low-surrogates) 范围 (\uDC00-\uDFFF)。

因此,一个 char 值表示基本多语言平面 (BMP - Basic Multilingual Plane) 代码点,包括代理代码点或 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 代码点(Unicode code point )用于 U+0000 到 U+10FFFF 范围内的字符值,Unicode 代码单元(Unicode code unit)用于 UTF-16 编码 char 的代码单元的 16 位值。有关 Unicode 术语的更多信息,请参阅 Unicode 词汇表

总结

看完以上文档,你能回答标题的问题了吗?
欢迎在评论里写下你的答案


Yujiaao
12.7k 声望4.7k 粉丝

[链接]