2013-03-19 89 views
4

我有一個帶有奇怪編碼「UCS-2 Little Endian」的文本文件,我想用Java讀取它的內容。閱讀任何具有奇怪編碼的文本文件?

Opening the text file using NotePad++

正如你可以在上面的截圖中看到文件的內容出現在記事本++很好,但是當我使用此代碼讀它,只是垃圾被打印在控制檯:

String textFilePath = "c:\strange_file_encoding.txt" 
BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(filePath), "UTF8")); 
String line = ""; 

while ((line = reader.readLine()) != null) { 
    System.out.println(line); // Prints garbage characters 
} 

重點是用戶選擇要讀取的文件,因此它可以是任何編碼,並且由於我無法檢測到文件編碼,我使用「UTF8」對其進行解碼,但是如上例所示,它無法正確讀取。

有沒有正確的方式閱讀這些奇怪的文件?或者至少我可以檢測到我的代碼是否會讀取不正確?

回答

5

您使用UTF-8作爲您的編碼InputStreamReader構造函數,所以它會嘗試將字節解釋爲UTF-8而不是UCS-LE。這裏是文檔:Charset

我想你需要使用UTF-16LE根據它。

這裏是所支持的字符集及其Java名稱的詳細信息: Supported Encodings

+0

非常感謝。正如我的問題所述,主要問題是這不是唯一使用的文本文件。用戶選擇要讀取的文件,並且它可以有任何編碼,那麼「UTF-16LE」會讀取任何具有任何編碼的文本文件嗎? – Brad 2013-03-19 22:41:11

+0

有沒有一個絕對的方式,但給這個鏡頭:[juniversalchardet](https://code.google.com/p/juniversalchardet/) – tempoc 2013-03-19 22:51:38

0

您在InputStreamReader中提供了錯誤的編碼。如果使用UTF8,您是否嘗試過使用UTF-16LE?

BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(filePath), "UTF-16LE")); 

根據Charset

UTF-16LE十六位UCS轉換格式,小尾數字節 爲了