utf8 type content charset java jsp encoding utf

java - type - jsp utf 8



codificación jsp utf (4)

Estoy teniendo dificultades para descubrir cómo manejar este problema:

Estoy desarrollando una herramienta web para una universidad italiana, y tengo que mostrar palabras con acentos (como è, ù, ...); a veces obtengo estas palabras de una tabla PostgreSql (codificada en UTF8), pero sobre todo tengo que leer largos pasajes de un archivo. Estos archivos están codificados como utf-8 xml y se muestran bien en Smultron o en cualquier editor de utf-8 (se crearon analizando en archivos antiguos de python con entidades como è lugar de "è").

Escribí una clase de Java que extrae los segmentos relevantes del archivo xml, que funciona así:

String s = parseText(filename, position)

si escribo el String devuelto en un archivo, todo se ve bien; el problema es que si lo hago

out.write(s)

en la página jsp, obtengo caracteres extraños. Por cierto, yo uso

String s = getWordFromPostgresql(...)

out.write(s)

en el mismo jsp y muestra OK.

¿Alguna pista?

Gracias Nicola

@ krosenvold

Gracias por su respuesta, sin embargo, esa directiva ya está en la página, pero no funciona (en realidad "funciona", pero solo para las cadenas que obtengo de la base de datos). Creo que hay algo sobre la lectura de los archivos, pero no puedo entender ... funcionan en "java" pero no en "jsp" (no se puede pensar en una mejor explicación ...)

Aquí hay un ejemplo básico extraído del código real: el método para leer de los archivos devuelve un Mapa, desde una Marca (un objeto que representa una posición en el texto) hasta una Cadena (que contiene el texto):

esto está en la página .jsp (con la directiva utf citada en las publicaciones anteriores)

// ... Map<Mark, String> map = TestoMarkParser.parseMarks(...); out.write(map.get(m));

Y este es el resultado:

"Fu però così en uso il Genere Enharmonico, che quelli quali vi si esercitavano,"

si pongo el mismo código en una clase java y sustituyo out.write con System.out.println, el resultado es el siguiente:

"Fu però così en uso il Genere Enharmonico, che quelli quali vi si esercitavano,"

He estado haciendo algunos análisis con un editor hexadecimal, aquí está:

Cuerda original: "fu però così"

ò en archivo xml: C3 B2

ò según lo procesado por out.write () en el archivo jsp: E2 88 9A E2 89 A4

ò como se escribió en el archivo a través de:

FileWriter w = new FileWriter(new File("out.txt")); w.write(s); // s is the parsed string w.close();

C3 B2

imprimiendo los valores de cada caracter como int

0: 70 = F 1: 117 = u 2: 32 = 3: 112 = p 4: 101 = e 5: 114 = r 6: 8730 = � 7: 8804 = � 8: 32 = 9: 99 = c 10: 111 = o 11: 115 = s 12: 8730 = � 13: 168 = � 14: 10 = `


String s = parseText(filename, position)

¿Dónde se define este método? Supongo que es tu propio método, que abre el archivo y extrae una parte particular de los datos. En algún lugar de este proceso, se está convirtiendo de bytes a caracteres, probablemente utilizando la codificación predeterminada para su JVM.

Si la codificación predeterminada de su JVM en ejecución no coincide con la codificación real en el archivo, obtendrá caracteres incorrectos en su cadena. Además, si estás leyendo contenido codificado en forma de varios bytes (como UTF-8), tu "posición" puede apuntar al medio de una codificación de varios bytes.

Si los archivos fuente están en un archivo XML bien formado, será mucho mejor utilizar un analizador real (como el que está integrado en el JDK) para analizarlos, ya que el analizador proporcionará la traducción correcta de los bytes a los caracteres. Luego use una expresión XPath para recuperar los valores.

Si no ha utilizado un analizador XML en el pasado, aquí hay dos documentos que escribí sobre análisis y XPath .

Editar: una cosa que puede ser útil es imprimir los valores de los caracteres reales en la cadena, utilizando algo como lo siguiente:

public static void main(String[] argv) throws Exception { String s = "testing/u20ac"; for (int ii = 0 ; ii < s.length() ; ii++) { System.out.println(ii + ": " + (int)s.charAt(ii) + " = " + s.charAt(ii)); } }

Probablemente también deba imprimir su juego de caracteres predeterminado, para que sepa cómo se traduce una secuencia particular de bytes a los caracteres:

public static void main(String[] argv) throws Exception { System.out.println(Charset.defaultCharset()); }

Y, por último, debe examinar la página servida como bytes sin formato, para ver exactamente qué se devuelve al cliente.

Editar # 2: el carácter ò es el valor Unicode 00F2, que sería UTF-8 codificado como C3 B2. Estos dos códigos no se corresponden con los símbolos que mostró en su respuesta anterior.

Para obtener más información sobre los caracteres Unicode, consulte los gráficos de códigos en Unicode.org.


En la directiva jsp page, debería intentar configurar su tipo de contenido en utf-8, que también configurará pageEncoding en utf-8.

<%@page contentType="text/html;charset=UTF-8"%>

UTF-8 no es un tipo de contenido predeterminado en jsp, y hay todo tipo de problemas interesantes que surgen de esto. El problema es que la secuencia subyacente se interpreta como una secuencia ISO-8859-1 de forma predeterminada. Si escribe algunos bytes Unicode en esta secuencia, se interpretarán como ISO-8859-1. Encuentro que establecer la codificación en utf-8 es la mejor solución.

Editar : Además, una variable de cadena en java siempre debe ser unicode. Entonces siempre deberías poder decir

System.out.println(myString)

y vea el juego de caracteres apropiado que viene en la ventana de la consola de su servidor web (o simplemente deténgase en el depurador y examínelo). Sospecho que verá caracteres incorrectos cuando haga esto, lo que me lleva a pensar que tiene un problema de codificación al construir la cadena.


Tengo algunos jsp internacionales [que tienen caracteres internacionales "especiales" (con respecto al inglés)].

Insertar esto [y solo esto, es decir: ninguna directiva contentType también (que hizo un error duplicado de contentType )] en la parte superior de ellos hizo que guardaran y renderizaran correctamente:

<%@page pageEncoding="UTF-8"%>

Esta referencia [http://www.inter-locale.com/codeset1.jsp] me ayudó a descubrir eso.


También tuve el mismo problema, todo es "utf-8" y por qué veo
Caracteres sin sentido y el problema estaba en jsp y debe estar al principio de la página.

<%request.setCharacterEncoding("utf-8");%>

y todo estará bien.