No momento, estou investigando como a decodificação SBCS/DBCS funciona no JDK e me deparei com um pedaço de código estranho na IBM930
implementação do conjunto de caracteres (embora não seja o único).
Em primeiro lugar, pelo que entendi, os implementadores do JDK usam arquivos de mapeamento para gerar a maioria das classes de conjuntos de caracteres. Por exemplo:
IBM930.map
IBM930.nr non-roundtrip bytes override
IBM930.c2b non-roundtrip codepoints override
são os arquivos que o utilitário DBCS interpreta para gerar IBM930.java
.
Se olharmos para IBM930.nr
, veremos:
25 000a
O que significa que byte 0x25
deve mapear para \u000a
.
Se olharmos agora para IBM930.map
, veremos:
...
24 0084
25 000A <---
26 0017
...
Portanto, a substituição sem ida e volta já foi especificada no arquivo .map principal.
Se abrirmos IBM930.java
, podemos ver na parte inferior:
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);
}
}
Especificamente estou apontando para String b2cNR = "\u0025\n"
.
Considerando que o arquivo .map principal já contém substituições de NR, por que o processo de geração gera um valor não nulo b2cNR
?
Será que é porque nem todos os arquivos .map são ajustados para incluir entradas .nr?
Ou estou ignorando um comportamento muito específico do initC2B
método?