JDK生成的字符集类中冗余非往返字节映射问题咨询
关于JDK IBM930字符集b2cNR变量非空的原因
以下是几个核心原因:
映射文件职责的历史分离
JDK早期的字符集生成工具链中,*.map文件原本仅承载双向可往返的字节-码点映射关系,而*.nr文件专门用于定义单向非往返的覆盖规则(即字节可映射为码点,但码点无法反向映射回原字节)。即便后续部分map文件新增了NR标记的条目,工具链仍保留了独立加载nr文件的逻辑——为兼容旧格式,不会自动去重合并,而是将两类文件中的NR条目整合后写入b2cNR变量。b2cNR与initC2B的独立逻辑
b2cNR的生成和initC2B方法是两个独立流程:b2cNR由工具直接从map的NR条目和nr文件中提取合并生成,只要任一来源有内容,就会生成非空数组;initC2B仅负责构建可往返的码点到字节的反向映射,会主动跳过NR条目,但这不会影响b2cNR的生成逻辑。
旧字符集的遗留兼容处理
像IBM930这类早期字符集,其*.nr文件是最初设计时就配套存在的。即便后续维护时把部分NR条目补充到了map文件中,生成工具的脚本并未修改为忽略nr文件,而是维持了"同时读取两类文件并合并NR条目"的旧逻辑,最终导致b2cNR变量非空。
内容的提问来源于stack exchange,提问作者LppEdd
相关产品推荐
相关产品推荐

