2012-07-07 15 views
5

Como el título dice ... He leído el contenido de la respuesta httoCómo convertir cadenas codificadas en windows-1250/Cp1250 a 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); 

He intentado un montón de variaciones. Estoy un poco confundido sobre cuáles son las constantes de codificación correctas usadas como cadenas. windows-1250 o Cp1250. UTF-8 o utf-8 o utf8?

Respuesta

6

Parece que piensas que un objeto String tiene una codificación. Eso no es correcto Una codificación se utiliza como parte de la traducción de datos binarios (un byte[] o InputStream) a datos de texto (un String o char[] etc.).

No está claro lo que IOUtils.toString está haciendo, pero es casi seguro que pierda datos o al menos lo maneje de manera inapropiada. Si sus datos están originalmente en Windows-1250, entonces debe usar un InputStreamReader envolviendo el InputStream, especificando el juego de caracteres en la llamada del constructor InputStreamReader.

No está claro dónde UTF-8 viene en - es posible que desee escribir los datos en UTF-8 después, pero el resultado de que sería byte[], no es una cadena.

+2

Técnicamente hablando, 'java.lang.String' tiene una codificación: UTF-16. –

4

Está realizando una conversión hacia atrás. Debe obtener los datos de entrada como una matriz byte y luego usar String(byteArray, "Cp1250") para crear el objeto String. Luego, si desea UTF-8, use String.getBytes("UTF-8").

0

Suponiendo Apache Commons IO, utilice one of the methods that specifies an encoding:

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

Todas las cadenas son implícitamente UTF-16 en Java. Otras codificaciones generalmente se representan usando matrices de bytes.

3

La codificación tiene un nombre canónico (único) y otros nombres variables, y no distingue entre mayúsculas y minúsculas. Por ejemplo, "UTF-8" es el nombre canónico, pero algunas versiones de Java dicen que fue "UTF8"; se escribió más sobre el uso común. Lo mismo para "Windows-1250", que también puede ver en páginas HTML. "Cp1250" (Código-Página) es un nombre interno de Java.

En byte java [] son ​​datos binarios, Cadena (internamente Unicode) es texto. La conversión entre ambos necesita una codificación, a menudo opcional, tomando el sistema operativo predeterminado.

bytes, InputStream, OutputStream < -> String, char, lector, escritor

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

Para permitir esta Cadena universales (qua codificación), Cadena internamente utiliza char, UTF-16. Las constantes de cadena se almacenan en el archivo .class como UTF-8 (más compacto).

-1

Veo mejor utilizar el escáner para leer en diferentes conjuntos de caracteres.

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

y el método vuelve next()String valor de charset de aplicación.

Probado en "idioma checo" de "cp1250" a "UTF-8".

Cuestiones relacionadas