【发布时间】:2021-01-12 23:44:56
【问题描述】:
定义了 Unicode 码位的数组是:
int[] unicodeDefinedCodePoints = IntStream
.rangeClosed(Character.MIN_CODE_POINT, Character.MAX_CODE_POINT)
.filter(Character::isDefined)
.toArray();
让我们将其转换为字符串并返回代码点:
int[] unicodeDefinedCodePointsAfterTransformation =
new String(unicodeDefinedCodePoints, 0, unicodeDefinedCodePoints.length)
.codePoints()
.toArray();
我希望得到相同的数组,但是
- 转换后的数组不包含代码点 56319 和 56320
- 转换后代码点 1113088 重复
以上代码点的代码都是十进制的。
使用的Java版本是:
openjdk version "1.8.0_275"
OpenJDK Runtime Environment (IcedTea 3.17.1) (build 1.8.0_275-b01 suse-1.1-x86_64)
OpenJDK 64-Bit Server VM (build 25.275-b01, mixed mode)
有什么想法吗?
谢谢。
【问题讨论】:
-
专业提示:在谈论 Unicode 代码点时,给出十六进制表示法几乎总是更有用。 56319 是 U+DBFF,56320 是 U+DC00,1113088 是 U+10FC00。仅此一项就可以通过查找这些代码点的定义来帮助您入门。不:我不知道到底发生了什么,但所有这些都接近“圆形边界”这一事实让我认为这种疯狂背后有一些原因。
-
前两个是代理,最后一个是私用。
-
@Thed,你到底想在这件事上完成什么?
-
我需要测试一个词法分析器。应该有两个测试,第一个带有词法分析器预期的输入,因此产生一些标记,第二个带有词法分析器意外的输入。我需要检查词法分析器是否不会产生任何带有意外输入的标记。为了进行意外输入,我将所有已定义的 Unicode 代码点收集到一个数组中,删除预期的代码点,然后创建一个剩余代码点的字符串。事实证明,将提到的代码点数组转换为字符串至少可能有这样奇怪的副作用。将调试它。