2012-07-07 9 views
5

Come il titolo dice ... ho letto il contenuto dalla risposta httoCome convertire String codificato in windows-1250/Cp1250 in utf-8?



    InputStream is = response.getEntity().getContent(); 
    String cw = IOUtils.toString(is); 
    byte[] b = cw.getBytes("Cp1250"); 
    String x = StringUtils.newStringUtf8(b); 
    String content = new String(b, "UTF-8"); 

    System.out.println(content); 

ho provato un sacco di varianti. Sono poco confuso su quali siano le costanti di codifica corrette usate come stringhe. windows-1250 o Cp1250. UTF-8 o utf-8 o utf8?

risposta

6

Sembra che un oggetto String abbia una codifica. Non è corretto Una codifica viene utilizzata come parte della traduzione da dati binari (a byte[] o InputStream) a dati di testo (a String o char[] ecc.).

Non è chiaro cosa stia facendo IOUtils.toString, ma è quasi certamente la perdita di dati o almeno la gestione impropriamente. Se i dati sono originariamente in Windows-1250, è necessario utilizzare InputStreamReader per il wrapping del InputStream, specificando il set di caratteri nella chiamata del costruttore InputStreamReader.

Non è chiaro dove UTF-8 è disponibile in - si potrebbe desiderare di scrivere i dati in UTF-8 dopo, ma il risultato di questo sarebbe byte[], non una stringa.

+2

Tecnicamente parlando, 'java.lang.String' ha una codifica: UTF-16. –

4

Stai convertendo all'indietro. È necessario ottenere i dati di input come array byte e quindi utilizzare String(byteArray, "Cp1250") per creare l'oggetto String. Quindi se si desidera UTF-8, utilizzare String.getBytes("UTF-8").

0

Supponendo Apache Commons IO, usare one of the methods that specifies an encoding:

String cw = IOUtils.toString(is, "windows-1250"); 

Tutte le stringhe sono implicitamente UTF-16 in Java. Altre codifiche sono generalmente rappresentate utilizzando array di byte.

3

La codifica ha un nome (univoco) canonico e altri nomi diversi e che non fa distinzione tra maiuscole e minuscole. Ad esempio "UTF-8" è il nome canonico, ma alcune versioni di Java erano "UTF8"; è stato scritto più per l'uso comune. Lo stesso per "Windows-1250", che potresti vedere anche nelle pagine HTML. "Cp1250" (Code-Page) è un nome interno java.

Nel byte java [] sono dati binari, String (internamente Unicode) è testo. La conversione tra entrambi richiede una codifica, spesso facoltativa, prendendo il sistema operativo predefinito.

byte, InputStream, OutputStream < -> Stringa, char, Reader, Writer

String cw = IOUtils.toString(is, "UTF-8"); // InputStream is binary gives byte[], hence give encoding 
byte[] b = cw.getBytes("Cp1250"); 
String x = new String(b, "Cp1250"); 
String content = s; 

System.out.println(content); 

Per consentire a questo String universale (codifica qua), String utilizza internamente char, UTF-16. Le costanti di stringa sono memorizzate nel file .class come UTF-8 (più compatto).

-1

È meglio utilizzare Scanner per la lettura in diversi set di caratteri.

FileInputStream is = new FileInputStream(fileOrPath); 
    Scanner scanner = new Scanner(is, "cp1250"); 
    String out = scanner.next(); 

e il metodo ritorna next()String valore charset di applicazione.

Testato su "lingua ceca" da "cp1250" a "UTF-8".