2011-11-29 6 views
10

Chcę pobrać kodowanie ze strumienia.Java: Jak mogę uzyskać kodowanie z inputStream?

Pierwsza metoda - użycie InputStreamReader.

Ale zawsze zwraca kodowanie OS.

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

wyjściowa: GBK

2-ty metoda - używać UniversalDetector.

Ale zawsze zwraca zero.

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

wyjściowa: null

Jak mogę uzyskać prawo? :(

+4

InputStreamReader będzie zawsze używać kodowania platformy. Nie próbuje wykryć kodowania w plikach. Jakiego rodzaju pliki używasz w UniversalDetector? W twoim przykładzie użyłeś pliku RAR, który jest skompresowanym formatem binarnym. Najpierw spróbuj użyć prostego pliku tekstowego ASCII. – prunge

+0

cześć, zmieniłem typ pliku, wyjście "Fortunes.txt": Nie wykryto kodowania –

+0

Nie wydaje się wykrywać "standardowego" UTF-8 lub UTF-16 bez BOM-u, ale działało dla UTF-16 z listą BOM dla mnie. Może rozważyć użycie innej biblioteki do wykrywania zestawów znaków? [Ten link] (http://stackoverflow.com/questions/499010/java-how-to-determine-trect-charrect-encoding-of-a-stream) może pomóc. – prunge

Odpowiedz

5

Niech wznowić sytuację:

  • InputStream dostarcza bajtów
  • * Czytelnicy dostarczają znaki w jakimś kodowaniu
  • nowy InputStreamReader (InputStream) wykorzystuje kodowanie systemu operacyjnego
  • nowy InputStreamReader (InputStream , "UTF-8") używa podanego kodowania (tutaj UTF-8):

Więc trzeba k teraz kodowanie przed odczytaniem. Zrobiłeś wszystko dobrze, używając najpierw klasy wykrywania zestawu znaków.

Czytanie http://code.google.com/p/juniversalchardet/ powinno obsługiwać UTF-8 i UTF-16. Możesz użyć edytora JEdit, aby zweryfikować kodowanie i sprawdzić, czy jest jakiś problem.

+0

Możemy użyć innych narzędzi do osiągnięcia, ale nie może zrozumieć specyficzną metodę leczenia wydaje się być do czynienia. :( –

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; 
}