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。
因此,这显然是一个错误修复。似乎也会影响同一组中的其他角色。