2011-11-29 34 views
10

Quiero obtener la codificación de una secuencia.Java: ¿Cómo puedo obtener la codificación de inputStream?

1er método: para utilizar el InputStreamReader.

Pero siempre devuelve la codificación del sistema operativo.

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

de salida: GBK

segundo método - para utilizar el UniversalDetector.

Pero siempre devuelve nulo.

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

de salida: null

¿Cómo puedo obtener el derecho? :(

+4

InputStreamReader siempre usará la codificación de la plataforma. No intenta detectar la codificación en los archivos. ¿Qué tipo de archivos está ejecutando a través de UniversalDetector? En su ejemplo, utilizó un archivo RAR, que es un formato binario comprimido. Pruebe con un simple archivo de texto ASCII primero. – prunge

+0

hola, he cambiado el tipo de archivo, salida 'Fortunes.txt': No se detectó codificación –

+0

No parece detectar 'estándar' UTF-8 o UTF-16 sin una lista de materiales, pero funcionó para UTF-16 con una lista de materiales para mí. ¿Tal vez considere usar una biblioteca diferente para la detección de juegos de caracteres? [Este enlace] (http://stackoverflow.com/questions/499010/java-how-to-determine-the-correct-charset-encoding-of-a-stream) podría ayudar. – prunge

Respuesta

5

Vamos a reanudar la situación:

  • InputStream entrega bytes
  • * Los lectores ofrecen caracteres de alguna codificación
  • nueva InputStreamReader (flujoEntrada) utiliza el sistema operativo codificación
  • nueva InputStreamReader (flujoEntrada , "UTF-8") utiliza la codificación dada (aquí UTF-8)

Entonces uno necesita k ahora la codificación antes de leer. Hiciste todo bien usando primero una clase de detección de juego de caracteres.

Lectura http://code.google.com/p/juniversalchardet/ debe manejar UTF-8 y UTF-16. Puede usar el editor JEdit para verificar la codificación y ver si hay algún problema.

+0

Podemos utilizar otras herramientas para lograrlo, pero no puede entender el método de tratamiento específico, parece ser que se debe tratar. :( –

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