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的规范映射。对此的权威参考是Unicode字符数据库中的UnicodeData.txt文件。因此,U + FA8E的正确NFC形式为U + 641C。

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

10-07 16:53