2011-05-09 28 views
10

¿Cómo puedo decodificar una cadena utf-8 en android? Tengo tratar con estos comandos, pero la producción es igual de entrada:string decode utf-8

URLDecoder.decode("hello&//à", "UTF-8"); 

new String("hello&//à", "UTF-8"); 

EntityUtils.toString("hello&//à", "utf-8"); 
+0

esa cadena no está en una codificación particular en absoluto. ¿Qué es, el problema que estás tratando de resolver? ¿Qué quieres decir exactamente con "decodificar"? ¿En qué codificación estaba, creíste? – BalusC

Respuesta

37

Una cadena no necesita codificación. Es simplemente una secuencia de caracteres Unicode.

Necesita codificar cuando desea convertir una cadena en una secuencia de bytes. El juego de caracteres que elija (UTF-8, cp1255, etc.) determina el mapeo Carácter-> Byte. Tenga en cuenta que un personaje no necesariamente se traduce en un solo byte. En la mayoría de los conjuntos de caracteres, la mayoría de los caracteres Unicode se traducen en al menos dos bytes.

codificación de una cadena se lleva a cabo por:

String s1 = "some text"; 
byte[] bytes = s1.getBytes("UTF-8"); // Charset to encode into 

Es necesario decodificar cuando se tiene la secuencia de bytes а y desea convertirlos en una cadena. Cuando hace eso, necesita especificar, nuevamente, el juego de caracteres con el que originalmente se codificaron los bytes (de lo contrario, terminará con un texto confuso).

Decodificación:

String s2 = new String(bytes, "UTF-8"); // Charset with which bytes were encoded 

Si se quiere entender esto mejor, un gran texto es "The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)"

4

las funciones básicas son getBytes(String charset) y new String(byte[] data). puede usar estas funciones para hacer decodificación UTF-8.

La decodificación UTF-8 en realidad es una conversión de cadena a cadena, el buffer intermedio es una matriz de bytes. ya que el objetivo es una cadena UTF-8, por lo que el único parámetro para new String() es la matriz de bytes, que llama es igual a new String(bytes, "UTF-8")

Entonces la clave es el parámetro de cadena de entrada codificada para obtener el conjunto de bytes interno, que debe saber de antemano Si no lo hace, adivine el más posible, "ISO-8859-1" es una buena suposición para el usuario inglés.

La sentencia de decodificación debe ser

String decoded = new String(encoded.getBytes("ISO-8859-1"));