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 楼答案
字符U+FA8E已映射到U+641C。这方面的权威参考是Unicode字符数据库中的UnicodeData.txt文件。因此,U+FA8E的正确NFC形式是U+641C
所以这显然是一个错误修复。这似乎也会影响同一组中的其他角色