为何CJK统一表意文字扩展B区码点未按组模式命名,JDK返回值异于预期?
这个差异是JDK对Unicode字符命名生成逻辑的历史实现缺陷导致的,核心原因如下:
- 两类码点的处理逻辑差异
U+FA21属于CJK兼容表意字符集合,在Unicode字符数据库(UCD)中明确标注了带#的na属性模板,JDK处理时直接按照规则将#替换为码点十六进制值,最终生成的名称完全符合Unicode规范,也就是你看到的"CJK COMPATIBILITY IDEOGRAPH-FA21"。U+2000A属于CJK统一表意文字扩展B区字符,本身也符合CJK UNIFIED IDEOGRAPHS-#的组命名规则,但JDK旧版本(Java 17及更早)的实现中,没有将CJK各扩展区的表意字符纳入模板匹配逻辑,直接走了兜底命名规则:将码点所属Unicode区块的名称转为全大写后拼接码点值,因此输出了不符合预期的"CJK UNIFIED IDEOGRAPHS EXTENSION B 2000A"。
- 修复情况
该问题属于JDK的已知Bug,在JDK 19及后续版本中已经完成修复,修复后调用Character.getName(0x2000A)会返回你预期的"CJK UNIFIED IDEOGRAPHS-2000A"。
内容的提问来源于stack exchange,提问作者Martijn
相关产品推荐
相关产品推荐

