Estoy tratando de pasar parámetros de un nivel medio PHP a un back-end java que comprende J2EE. Estoy escribiendo el código del controlador en Groovy. Ahí, intento decodificar algún parámetro que probablemente contenga caracteres internacionales.decodificación utf-8 en java
Estoy realmente desconcertado por los resultados de mi depuración de este problema hasta ahora, por lo tanto, quería compartirlo con usted con la esperanza de que alguien será capaz de dar la interpretación correcta de mis resultados.
Por el bien de mi pequeña prueba, el parámetro que estoy pasando es "déjeuner". Sólo para estar seguro, System.out.println ("déjeuner") me da correctamente:
déjeuner
en la consola
Ahora siguientes son los/dec y hexagonales valores CHAR de cada carbón de leña de la cadena original :
next char: d 100 64
next char: ? -61 c3
next char: ? -87 a9
next char: j 106 6a
next char: e 101 65
next char: u 117 75
next char: n 110 6e
next char: e 101 65
next char: r 114 72
nota que la secuencia c3a9 en UTF-8 es el carácter deseado-para: http://www.fileformat.info/info/unicode/char/00e9/index.htm
Ahora bien, si trato de leer esta cadena como una cadena UTF-8, como en stmt.ge TBytes ("UTF-8"), de repente acaban teniendo una secuencia de 11 bytes, como sigue:
64 c3 83 c2 a9 6a 65 75 6e 65 72
mientras que stmt.getBytes ("iso-8859-1") me da 9 bytes:
64 c3 a9 6a 65 75 6e 65 72
¡tenga en cuenta la secuencia c3a9 aquí!
ahora si intento de convertir la secuencia de codificación UTF-8 a UTF-8, como en
new String(stmt.getBytes("UTF-8"), "UTF-8");
me sale:
next char: d 100 64
next char: ? -61 c3
next char: ? -87 a9
next char: j 106 6a
next char: e 101 65
next char: u 117 75
next char: n 110 6e
next char: e 101 65
next char: r 114 72
nota la secuencia c3a9
mientras
new String(stmt.getBytes("iso-8859-1"), "UTF-8")
resultados en:
next char: d 100 64
next char: ? -23 e9
next char: j 106 6a
next char: e 101 65
next char: u 117 75
next char: n 110 6e
next char: e 101 65
next char: r 114 72
observe el e9 que en utf-8 (y ascii) es, de nuevo, el carácter 'é' que estoy deseando.
Desafortunadamente, en ninguno de los casos estoy terminando con una cadena adecuada que se muestre como la cadena literal "déjeuner". Curiosamente, las secuencias de bytes parecen correctas.
Gracias por la informativa respuesta. Entonces se reduce a request.getParameter() en javax.servlet.http.HttpServletRequest para no manejar correctamente las secuencias de bytes codificadas en UTF-8, ¿verdad? Aunque he llamado a req.setCharacterEncoding ("UTF-8"). ¿Qué posible solución alternativa me queda? Todavía no está claro para mí cómo obtengo los datos originales para mis parámetros (sus bytes, no los caracteres), así que puedo obtener una implementación String _non-buggy_ para resolver la cadena correcta de UTF ... – user162346
Supongo que el remitente codifica los datos con UTF-8, pero no establece los encabezados HTTP correctos para esto. –
Así que asegúrese de que la parte de PHP genere páginas web que especifiquen correctamente su codificación, especialmente en los formularios. –