2011-06-17 16 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

相關問題