如何将Cp1252字节数组转换为正确的字符串?

时间:2011-06-17 01:22:19

标签: java encoding

大家好,所有代码如下:

File file2 = new File("D://deploy//body.txt");

byte[] bytes = loadFile(file2);
System.out.println(bytes.length);

StringBuffer buffer = new StringBuffer();
InputStream inputStream = new ByteArrayInputStream(bytes);
InputStreamReader reader = new InputStreamReader(inputStream,"CP1252");
Reader in = new BufferedReader(reader);
int ch;
while ((ch = in.read()) > -1) {
    buffer.append((char)ch);
}
in.close(); 
System.out.println(buffer.toString().getBytes().length);

对于字节数组的长度,最终结果是1576和2439。将CP1252字节数组转换为字符串并保持适当大小的正确方法是什么?感谢

2 个答案:

答案 0 :(得分:3)

我注意到你的短语 - “正确的字符串”,并且想指出在你的情况下没有正确或不正确的字符串。这是正确或不正确的编码。

您正在读取cp1252字节的字节序列,并将各个字符附加到缓冲区中。如果原始文件位于cp1252中,则此过程没有问题。在引擎盖下,InputStreamReader使用能够解码流的底层字符集的CharsetDecoder成为16位Unicode字符(UTF-16)的序列。这样做是因为您正在从字节流中读取字符。

As pointed out by bmargulies,当您执行buffer.toString().getBytes()时,您正在将这些UTF-16字符序列转换为与平台具有相同编码的字节序列。由于这不是cp1252,原始字节数组和转换后的字节数组的长度不具有可比性。指定getBytes()方法的字符集会导致StringEncoder(这是一个带有Oracle / Sun JVM的内部类;其他实现可能使用不同的类)来将UTF-16字符序列转换为序列所需编码中的字节数(cp1252)。

答案 1 :(得分:2)

System.out.println(buffer.toString().getBytes().length);

毫无意义。它获取默认编码中的字节,几乎可以肯定不是cp1252。

请尝试getBytes("cp1252")