我知道这是一个非常普遍的问题,但我变得很生气。
我使用了这段代码:
String ucs2Content = new String(bufferToConvert, inputEncoding);
byte[] outputBuf = ucs2Content.getBytes(outputEncoding);
return outputBuf;
但我读到最好使用 CharsetDecoder 和 CharsetEncoder (我的内容可能包含目标编码之外的某些字符)。我刚刚编写了这段代码,但有一些问题:
// Create the encoder and decoder for Win1252
Charset charsetInput = Charset.forName(inputEncoding);
CharsetDecoder decoder = charsetInput.newDecoder();
Charset charsetOutput = Charset.forName(outputEncoding);
CharsetEncoder encoder = charsetOutput.newEncoder();
// Convert the byte array from starting inputEncoding into UCS2
CharBuffer cbuf = decoder.decode(ByteBuffer.wrap(bufferToConvert));
// Convert the internal UCS2 representation into outputEncoding
ByteBuffer bbuf = encoder.encode(CharBuffer.wrap(cbuf));
return bbuf.array();
确实这段代码将空字符序列附加到缓冲区!!!!!
有人能告诉我问题出在哪里吗?我对Java中的编码转换不太熟练。
有没有更好的方法来转换Java中的编码?
你的问题是ByteBuffer.array()
返回对用作 ByteBuffer 后备存储的数组的直接引用,而不是后备数组有效范围的副本。你必须服从bbuf.limit()
(正如彼得在他的回应中所做的那样)并且只使用索引中的数组内容0
to bbuf.limit()-1
.
后备数组中存在额外 0 值的原因是 CharsetEncoder 创建结果 ByteBuffer 的方式存在一个小缺陷。每个 CharsetEncoder 都有一个“每个字符的平均字节数”,这对于 UCS2 编码器来说似乎简单且正确(2 个字节/字符)。遵循这个固定值,CharsetEncoder 最初分配一个具有“字符串长度 * 每个字符的平均字节数”字节的 ByteBuffer,在本例中例如10 个字符长的字符串需要 20 个字节。然而,UCS2 CharsetEncoder 以 BOM(字节顺序标记)开始,它也占用 2 个字节,因此 10 个字符中只有 9 个适合分配的 ByteBuffer。 CharsetEncoder 检测到溢出并分配一个长度为 2*n+1 的新 ByteBuffer(n 是 ByteBuffer 的原始长度),在本例中 2*20+1 = 41 字节。由于仅需要 21 个新字节中的 2 个来对剩余字符进行编码,因此您获得的数组bbuf.array()
长度为 41 字节,但是bbuf.limit()
将表明仅实际使用前 22 个条目。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)