2009-06-11 110 views
10

真的很簡單的問題。我需要在Java程序中讀取一個Unicode文本文件。用java讀取unicode文本文件

我習慣使用ASCII純文本與一個BufferedReader的FileReader組合這顯然是不工作:(

我知道我可以使用緩衝Reader讀取的在「傳統」的方式字符串然後將其轉換使用類似:

temp = new String(temp.getBytes(), "UTF-16"); 

但是,有沒有辦法來包裝讀者一個「轉換器」

編輯:?文件開始與FF FE

回答

13

你不會換的讀者,而不是你想包使用一個InputStreamReader流。 然後,您可以換與你的BufferedReader您當前使用的

BufferedReader in = new BufferedReader(new InputStreamReader(stream, encoding)); 
+1

我想讀希伯來文字母,我會用「編碼」來代替什麼? – CodyBugstein 2013-10-30 16:12:36

+1

回答我自己的問題,它是「UTF-8」 – CodyBugstein 2013-10-30 16:15:37

+0

'構造函數BufferedReader(InputStreamReader)是未定義'? – Squareoot 2016-12-15 15:29:47

7

一些注意事項:

  • 的「UTF-16」編碼可以閱讀標有兩種little-或大端編碼的文件BOM;有關Java 6編碼列表,請參閱here;它沒有明確說明使用「UTF-16」編寫時將使用什麼字節順序 - 它看起來是大字節編碼 - 所以在保存數據時可能需要使用「UnicodeLittle」
  • 使用字符串類編碼時要小心/解碼方法,尤其是像UTF-16的顯着可變寬度編碼 - use them only on whole data
  • 如其他人所說,通常最好通過用InputStreamReader包裹您的InputStream讀取字符數據;您可以使用StringBuilder或類似的緩衝區將concatenate your input整合到單個字符串中。
-1
Scanner scan = new Scanner(new File("C:\\Users\\daniel\\Desktop\\Corpus.txt")); 
    while(scan.hasNext()){ 

    System.out.println(scan.nextLine()); 
    } 
1

我會建議使用UnicodeReader從谷歌數據API,看到this answer了類似的問題。它會自動檢測來自字節順序標記(BOM)的編碼。

您也可以考慮Apache Commons IO中的BOMInputStream,它基本上相同但不包含所有備選版本的BOM。