为什么新的String(bytes,enc).getBytes(enc)不返回原始字节数组?

Boz*_*zho 17 java

我做了以下"模拟":

byte[] b = new byte[256];

for (int i = 0; i < 256; i ++) {
    b[i] = (byte) (i - 128);
}
byte[] transformed = new String(b, "cp1251").getBytes("cp1251");

for (int i = 0; i < b.length; i ++) {
    if (b[i] != transformed[i]) {
        System.out.println("Wrong : " + i);
    }
}
Run Code Online (Sandbox Code Playgroud)

对于cp1251这个输出只有一个错误的字节 - 在位置25.
对于KOI8-R- 所有罚款.
适用于cp1252- 4或5个差异.

这是什么原因以及如何克服这个原因?

我知道在任何编码中将字节数组表示为字符串是错误的,但这是支付提供商协议的要求,所以我没有选择权.

更新:ISO-8859-1作品中代表它,我将它用于byte[]部分和cp1251文本部分,所以问题仍然只是出于好奇

lex*_*ore 11

目标集中不支持某些"字节" - 它们将替换为?字符.转换回来时,?通常会转换为字节值63 - 这与以前不同.


Mic*_*rdt 7

这是什么原因

原因是字符编码不一定是双射的,并且没有充分的理由期望它们.并非所有字节或字节序列在所有编码中都是合法的,并且通常非法序列被解码为某种占位符字符,如"?" 或者U + FFFD,当然在重新编码时不会产生相同的字节.

另外,一些编码可以将一些合法的不同字节序列映射到相同的字符串.