2011-06-17 75 views
2

您好所有的代码如下:如何将Cp1252字节数组转换为正确的字符串?

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字节数组转换为字符串并保持适当大小的正确方法是什么?谢谢

+0

你正在做的正确...只是长度计数不正确。看到@bmargulies的回答 – 2011-06-17 01:29:41

回答

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)。

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

是没有意义的。它获取默认编码中的字节,这几乎肯定不是cp1252。

尝试getBytes("cp1252")来代替。

+0

啊,是的,这很好。只是为了确认,如果我将字节[]转换为cp1252字符串,请执行一些字符串操作,例如分割它并获取内容,将调用finalstring.getBytes(“cp1252”);让我获得正确的结果? – Maurice 2011-06-17 01:33:10

+0

是............ – 2011-06-17 01:36:49

相关问题