有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

unicode是否在Java6和Java7之间更改了NFC规范化语义?

unicode字符U+FA8E CJK COMPATIBILITY IDEOGRAPH-FA8E是映射到U+641C [CJK Unified Ideographs]的兼容字符。在Java 6 NFC中,规范化使其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的事实让我感到好奇


共 (1) 个答案

  1. # 1 楼答案

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

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