2011-11-29 13 views
10

Voglio ottenere la codifica da un flusso.Java: come posso ottenere la codifica da inputStream?

1o metodo: per utilizzare InputStreamReader.

Ma restituisce sempre la codifica del sistema operativo.

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

uscita: GBK

secondo metodo - per utilizzare l'UniversalDetector.

Ma restituisce sempre 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(); 

uscita: null

Come posso ottenere il giusto? :(

+4

InputStreamReader utilizza sempre la codifica della piattaforma. Non tenta di rilevare la codifica nei file. Che tipo di file stai usando attraverso UniversalDetector? Nel tuo esempio hai usato un file RAR, che è un formato binario compresso. Prova prima con un semplice file di testo ASCII. – prunge

+0

hi, ho cambiato il tipo di file, output 'Fortunes.txt': Nessuna codifica rilevata –

+0

Non sembra rilevare 'standard' UTF-8 o UTF-16 senza BOM, ma ha funzionato per UTF-16 con una BOM per me. Forse prendere in considerazione l'utilizzo di una libreria diversa per il rilevamento del set di caratteri? [Questo collegamento] (http://stackoverflow.com/questions/499010/java-how-to-determine-the-correct-charset-encoding-of-a-stream) potrebbe aiutare. – prunge

risposta

5

Riprendiamo la situazione:

  • InputStream offre byte
  • * I lettori offrono caratteri in qualche codifica
  • nuovo InputStreamReader (inputStream) utilizza la codifica del sistema operativo
  • nuovo InputStreamReader (inputStream , "UTF-8") utilizza la codifica data (qui UTF-8)

Quindi è necessario k ora la codifica prima di leggere. Hai fatto tutto bene usando prima una classe di rilevamento charset.

La lettura di http://code.google.com/p/juniversalchardet/ deve gestire UTF-8 e UTF-16. Potresti usare l'editor JEdit per verificare la codifica e vedere se c'è qualche problema.

+0

Siamo in grado di utilizzare altri strumenti per raggiungere, ma non può capire il metodo di trattamento specifico, sembra essere quello di affrontare. :( –

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