2011-11-29 58 views
10

我想從流中獲取編碼。Java:我怎樣才能從inputStream獲取編碼?

第一種方法 - 使用InputStreamReader。

但它總是返回操作系統編碼。

InputStreamReader reader = new InputStreamReader(new FileInputStream("aa.rar")); 
System.out.println(reader.getEncoding()); 

輸出:GBK

第二方法 - 使用UniversalDetector會。

但它總是返回null。

FileInputStream input = new FileInputStream("aa.rar"); 

    UniversalDetector detector = new UniversalDetector(null); 
    byte[] buf = new byte[4096]; 

    int nread; 
    while ((nread = input.read(buf)) > 0 && !detector.isDone()) { 
     detector.handleData(buf, 0, nread); 
    } 

    // (3) 
    detector.dataEnd(); 

    // (4) 
    String encoding = detector.getDetectedCharset(); 

    if (encoding != null) { 
     System.out.println("Detected encoding = " + encoding); 
    } else { 
     System.out.println("No encoding detected."); 
    } 

    // (5) 
    detector.reset(); 

輸出:空

我怎樣才能得到正確的? :(

+4

InputStreamReader將始終使用平臺編碼。它不會嘗試檢測文件中的編碼。 通過UniversalDetector運行什麼類型的文件?在你的例子中,你使用了一個RAR文件,它是一個壓縮的二進制格式。首先嚐試使用簡單的ASCII文本文件。 – prunge

+0

嗨,我改變了文件類型,'Fortunes.txt'輸出:沒有檢測到編碼 –

+0

似乎沒有檢測到'標準'UTF-8或UTF-16沒有BOM,但它的工作原理是UTF-16爲我提供BOM。也許考慮使用不同的庫進行字符集檢測? [此鏈接](http://stackoverflow.com/questions/499010/java-how-to-determine-the-correct-charset-encoding-of-a-stream)可能會有所幫助。 – prunge

回答

5

讓我們恢復情況:

  • InputStream中提供字節
  • *讀者在一些編碼傳遞字符
  • 新的InputStreamReader(的inputStream)使用的操作系統編碼
  • 新的InputStreamReader(的inputStream ,「UTF-8」)使用給定的編碼(這裏是UTF-8)

所以需要k現在閱讀前的編碼。您首先使用字符集檢測類來做所有事情。

閱讀http://code.google.com/p/juniversalchardet/它應該處理UTF-8和UTF-16。 您可以使用編輯器JEdit來驗證編碼,並查看是否有問題。

+0

我們可以用其他工具來實現,但是它不能理解具體的處理方法,似乎是要處理的。 :( –

0
public String getDecoder(InputStream inputStream) { 

    String encoding = null; 

    try { 
     byte[] buf = new byte[4096]; 
     UniversalDetector detector = new UniversalDetector(null); 
     int nread; 

     while ((nread = inputStream.read(buf)) > 0 && !detector.isDone()) { 
      detector.handleData(buf, 0, nread); 
     } 

     detector.dataEnd(); 
     encoding = detector.getDetectedCharset(); 
     detector.reset(); 

     inputStream.close(); 

    } catch (Exception e) { 
    } 

    return encoding; 
}