2010-10-29 54 views
7

Intento convertir una cadena UTF8 en una cadena Java Unicode.Cómo convertir UTF8 a Unicode

String question = request.getParameter("searchWord"); 
byte[] bytes = question.getBytes(); 
question = new String(bytes, "UTF-8"); 

La entrada son caracteres chinos y cuando comparo el código hexadecimal de cada caracter, es el mismo carácter de Chinses. Así que estoy bastante seguro de que el juego de caracteres es UTF8.

¿Dónde me equivoco?

Respuesta

11

No existe una "cadena UTF-8" en Java. Todo está en Unicode.

Cuando llama al String.getBytes() sin especificar una codificación, que usa la codificación predeterminada de la plataforma, eso casi siempre es una mala idea.

No debería tener que hacer nada para obtener los caracteres correctos aquí; la solicitud debería manejarlo todo para usted. Si no lo está haciendo, es probable que ya haya perdido datos.

¿Podría dar un ejemplo de lo que realmente está yendo mal? Especifique los valores Unicode de los caracteres en la cadena que está recibiendo (por ejemplo, usando toCharArray() y luego convirtiendo cada char en un int) y lo que esperaba recibir.

EDIT: Para diagnosticar esta, usar algo como esto:

public static void dumpString(String text) { 
    for (int i = 0; i < text.length(); i++) { 
     System.out.println(i + ": " + (int) text.charAt(i)); 
    } 
} 

Tenga en cuenta que que dará el valor decimal de cada carácter Unicode. Si tiene un práctico método de biblioteca hexadecimal, puede usarlo para darle el valor hexadecimal. El punto principal es que va a volcar los caracteres Unicode en la cadena.

+0

告 Este personaje, por ejemplo, necesita ser convertido consigo 229 145 138 esta representación decimal whichis correcta de acuerdo con http://www.ansell-uebersetzungen.com/gbuni.html porque es esta representación hexadecimal: E5 91 8A Así que ahora necesito que se convierta en unicode. I –

+0

Entonces, en mi opinión, la solicitud envía los caracteres correctos pero no puedo leerlos en Java, es necesario convertirlos a Unicode –

+0

@Rob: No, eso debería aparecer en la cadena como U + 544A. La representación hexadecimal que ha citado es la representación UTF-8, que * nunca * será lo que está en la cadena misma. Usted dice que "obtiene" 229 145 138 - ¿Cuándo hace qué? Editaré mi respuesta con un código de diagnóstico. –

2

Primero asegúrese de que los datos estén realmente codificados como UTF-8.

Existen algunas incoherencias entre los navegadores con respecto a la codificación utilizada al enviar datos de formularios HTML. La forma más segura de enviar datos codificados UTF-8 desde un formulario web es poner ese formulario en una página que se sirve con el encabezado Content-Type: text/html; charset=utf-8 o contiene una metaetiqueta <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />.


ahora para decodificar correctamente la llamada de datos request.setCharacterEncoding("UTF-8") en su servlet antes de la primera llamada a request.getParameter().

El contenedor de servlet se encarga de la codificación por usted. Si usa setCharacterEncoding() correctamente, puede esperar que getParameter() devuelva cadenas normales de Java.

+0

El juego de caracteres está justo en html. –

+0

Ahora cuando convierto Obtengo la representación de Unicode 63 para cada carácter Supongo que mi conversión sigue siendo incorrecta –

+0

@Rob No debería tener que hacer ninguna conversión manual. Debería llamar a 'setCharacterEncoding (" UTF-8 ")' y usar 'request.getParameter()' para obtener una cadena Java Unicode normal. Supongo que tu código también funciona con caracteres Ascii normales. –

0

También es posible que necesite un filtro especial que se encargará de la codificación de sus solicitudes. Por ejemplo existe tal marco del filtro en la primavera org.springframework.web.filter.CharacterEncodingFilter

0
String question = request.getParameter("searchWord"); 

es todo lo que tiene que hacer en su código del servlet. En este punto, no tiene que ocuparse de codificaciones, conjuntos de caracteres, etc. Todo esto lo maneja el servlet-infrastucture. Cuando ve problemas como mostrar ,?, Ã en algún lugar, tal vez haya algún problema con la solicitud enviada por el cliente. Pero sin saber algo de la infraestructura o del tráfico HTTP registrado, es difícil saber qué es lo que está mal.

-1

posiblemente.

question = new String(bytes, "UNICODE"); 
Cuestiones relacionadas