我目前正在研究 SBCS/DBCS 解码在 JDK 中的工作方式,并且我偶然发现了字符集实现中的一段奇怪的代码IBM930
(尽管它不是唯一的)。
首先,据我了解,JDK 实现者使用映射文件来生成大多数字符集类。例如:
IBM930.map
IBM930.nr non-roundtrip bytes override
IBM930.c2b non-roundtrip codepoints override
是DBCS实用程序解释生成的文件IBM930.java
。
如果我们仔细研究IBM930.nr
,就会发现:
25 000a
这意味着字节0x25
必须映射到\u000a
。
如果我们现在看一下IBM930.map
,我们会看到:
...
24 0084
25 000A <---
26 0017
...
因此,非往返覆盖已在主 .map 文件中指定。
如果我们打开IBM930.java
,可以在最底部看到:
static class EncodeHolder {
static final char[] c2b = new char[0x7400];
static final char[] c2bIndex = new char[0x100];
static {
String b2cNR = "\u0025\n";
String c2bNR = ...
DoubleByte.Encoder.initC2B(DecodeHolder.b2cStr, DecodeHolder.b2cSBStr,
b2cNR, c2bNR,
0x40, 0xfe,
c2b, c2bIndex);
}
}
具体来说,我指的是String b2cNR = "\u0025\n"
。
鉴于主 .map 文件已经包含 NR 覆盖,为什么生成过程仍然会生成非空值b2cNR
?
是不是因为并非所有 .map 文件都调整为包含 .nr 条目?
还是我忽略了该initC2B
方法的某个特定行为?