1

unicode 字符U+FA8E CJK COMPATIBILITY IDEOGRAPH-FA8E是映射到的兼容性字符U+641C [CJK Unified Ideographs]。在 Java 6NFC规范化中留下了它U+FA8E,而在 Java 7 中它确实将其分解为U+641C?

运行这个小片段时:

String fancyChar = "\uFA8E";
String normalized = Normalizer.normalize(fancyChar, Normalizer.Form.NFC);
System.out.printf("%04x == %04x\n", (int)(fancyChar.charAt(0)), (int)(normalized.charAt(0)));
System.out.println(fancyChar.equals(normalized));

在 Java 6(Sun/Oracle 和 OpenJDK 的最新版本)中:

fa8e == fa8e
true

在 Java 7(Sun/Oracle 和 OpenJDK 的最新版本)中:

fa8e == 641c
false

所以我的问题是,为什么会发生这种变化?

阅读UNICODE NORMALIZATION FORMS似乎 NFC 不应该使用兼容性映射分解字符?

但 Oracle 和 OpenJDK 都已将其转换为 Java 7 的事实让我感到奇怪。

4

1 回答 1

3

字符 U+FA8E 具有到 U+641C 的规范映射。这方面的权威参考是 Unicode 字符数据库中的UnicodeData.txt文件。因此,U+FA8E 的正确 NFC 形式是 U+641C。

所以这显然是一个错误修复。它似乎也会影响同一组中的其他角色。

于 2013-10-20T20:28:52.340 回答