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 切换了这一点这一事实让我感到奇怪。
最佳答案
字符 U+FA8E 具有到 U+641C 的规范映射。这方面的权威引用是UnicodeData.txt Unicode 字符数据库中的文件。因此,U+FA8E 的正确 NFC 形式是 U+641C。
所以这显然是一个错误修复。它似乎也会影响同一组中的其他角色。
关于java - NFC 规范化语义在 Java 6 和 7 之间是否发生了变化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19481046/