2011-11-29 28 views
10

Tôi muốn nhận mã hóa từ luồng.Java: Làm thế nào tôi có thể nhận được mã hóa từ inputStream?

Phương pháp thứ nhất - để sử dụng InputStreamReader.

Nhưng nó luôn trả về mã hóa hệ điều hành.

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

đầu ra: GBK

phương pháp thứ 2 - sử dụng UniversalDetector.

Nhưng nó luôn trả về giá trị rỗng.

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(); 

đầu ra: null

Làm thế nào tôi có thể nhận bên phải? :(

+4

InputStreamReader sẽ luôn sử dụng mã hóa nền tảng. Nó không cố gắng để phát hiện mã hóa trong các tập tin. Loại tệp nào bạn đang chạy thông qua UniversalDetector? Trong ví dụ của bạn, bạn đã sử dụng một tệp RAR, là một định dạng nhị phân nén. Hãy thử với một tập tin văn bản ASCII đơn giản đầu tiên. – prunge

+0

hi, tôi đã thay đổi loại tệp, đầu ra 'Fortunes.txt': Không phát hiện mã hóa –

+0

Nó dường như không phát hiện 'chuẩn' UTF-8 hoặc UTF-16 mà không có BOM, nhưng nó hoạt động cho UTF-16 với một BOM cho tôi. Có thể xem xét sử dụng một thư viện khác để phát hiện ký tự? [Liên kết này] (http://stackoverflow.com/questions/499010/java-how-to-determine-the-correct-charset-encoding-of-a-stream) có thể hữu ích. – prunge

Trả lời

5

Hãy tiếp tục tình trạng này:

  • InputStream cung cấp byte
  • * Độc giả cung cấp chars trong một số mã hóa
  • InputStreamReader mới (InputStream) sử dụng mã hóa hệ điều hành
  • mới InputStreamReader (InputStream , "UTF-8") sử dụng mã hóa đã cho (tại đây UTF-8)

Vì vậy, người ta cần phải k bây giờ mã hóa trước khi đọc. Bạn đã làm mọi thứ đúng bằng cách sử dụng lớp phát hiện bộ ký tự đầu tiên.

Đọc http://code.google.com/p/juniversalchardet/ cần xử lý UTF-8 và UTF-16. Bạn có thể sử dụng trình chỉnh sửa JEdit để xác minh mã hóa và xem liệu có sự cố nào không.

+0

Chúng ta có thể sử dụng các công cụ khác để đạt được, nhưng nó không thể hiểu được phương pháp điều trị cụ thể, Dường như để giải quyết. :( –

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; 
} 
Các vấn đề liên quan