java - NFC 规范化语义在 Java 6 和 7 之间是否发生了变化?

标签 java unicode java-7 normalization unicode-normalization

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/

相关文章:

java - 如何使用 JAVA 向 COM PORT 发送数据?

java - 如何在 Spring Boot 中使用 Java 通过更改 JSON 结构中的字段名称(如本例所示)从 JSON 响应中提取特定部分?

java - 在 jsp 和 struts 中的查询字符串中传递值

javascript - 无法显示来自 unicode JSON 响应的表情符号

azure - 如何在azure逻辑应用程序中处理Unicode字符(U+200E)

php - unicode 模式下的 preg_split : delim_capture not working?

java - 将dll添加到spring mvc项目中

java - 在 MQ v6 api 中 - 如何停止 MQQueue get() 方法?

路径之间的 java.nio.Path relativize 做假设,我无法检查

java - 如何将方法 StageHelper.getStages() 从 java 1.7 替换为 java 11