Configuración de una Aplicación Web en Tomcat con codificación UTF-8

6
62480

Índice de Contenidos

      1. Internacionalización

      2. Problemas en la codificación de caracteres

      3. Soporte para codificación de caracteres en UTF-8

                 3.1 Configuración del cliente

3.2 Configuración del Tomcat

      4. Conclusión

1. Internacionalización

Muy a menudo nos encontramos con el problema de tener que traducir una aplicación web a un idioma que contiene caracteres diferentes al que se tenía actualmente definido. Si inicialmente no se contempló esta posibilidad ya que se pensó que nunca se debería traducir a otro idioma nos encontramos con un grave problema. Llegados a este punto y teniendo en cuenta que no podemos dar marcha atrás para volver a definir los requisitos iniciales, nos acarreará mucho tiempo y esfuerzo la modificación de todas las páginas para dotarlas de soporte internacional. Por todo esto es importante tener en cuenta desde el principio la codificación de caracteres que tendrá nuestra aplicación web.

Puedes leer más sobre internacionalización aquí

2. Problemas en la codificación de caracteres

La codificación de caracteres en una aplicación web es un tema que suele dar bastantes problemas a los desarrolladores ya que no está del todo claro qué formato hay que seguir y cuál es el que suelen utilizan los servidores web, bases de datos o navegadores web.

Cuando se recibe o envía texto a una página web, lo que en un principio parece algo muy simple en realidad no lo es tanto ya que para que ese texto sea interpretado y escrito en pantalla por el navegador web y manejado por el servidor web hasta llegar a la base de datos, en ocasiones “pasa por muchas manos”.

A menudo ocurre que se tiene configurado un formato de codificación de caracteres diferente en el navegador del cliente, otro para el servidor web y otro en la base de datos. Hay que tener especial cuidado con esto ya que si tenemos una aplicación web como la del ejemplo de abajo, si el cliente envía los caracteres en UTF-8, el servidor web los espera en ISO-8859-5 y en la base de datos deben guardarse como SQL_ASCII no hay forma de que la aplicación funcione correctamente.

3. Soporte para codificación de caracteres en UTF-8

UTF-8 es un estándar de codificación de longitud variable que utiliza caracteres Unicode y que soporta la mayoría de los lenguajes del mundo por lo que es muy recomendable. Con UTF-8 no tendremos que preocuparnos de escribir el código HTML de cada carácter especial (ñ,  vocales acentuadas …) como se hace algunas veces ya que se establece internamente una referencia entre el carácter introducido y su código de representación UTF-8.

Para dotar a nuestras páginas con soporte para codificación de caracteres en UTF-8 habrá que seguir los siguientes pasos:

3.1 Configuración del cliente

1. En la primera línea de cada JSP se debe indicar el encoding de la página a utilizar de manera que cuando se envía la petición por HTTP entre el cliente y el servidor, el navegador sepa en qué formato debe enviar los caracteres para que el servidor los procese correctamente.

3.2 Configuración del Tomcat

2. En la parte del servidor también tenemos que especificar el encoding a utilizar. En Tomcat por defecto se especifica el formato de codificación ISO-8859-1. Para cambiar la codificación tenemos que modificar el archivoserver.xml que se encuentra en DIRECTORIO_INSTALACION_TOMCAT\conf\server.xml.

Añadimos el atributo URIEncoding=“UTF-8” en la etiqueta <Connector port=8080” … /> ya que es aquí donde se configura el comportamiento que sigue Tomcat cuando recibe peticiones a través del puerto 8080.

3. Podría ser necesario especificar al contenedor de servlets Catalina la codificación a utilizar indicándole en el arranque que los caracteres siempre van en UTF-8. Para ello editamos el fichero catalina.bat (Windows) o elcatalina.sh (Linux) y añadimos lo siguiente:

A la vez indicamos las opciones del arranque de la JVM en UTF-8 por lo que añadimos al mismo fichero.

4. Por último debemos forzar a que la request soporte los caracteres en UTF-8 ya que cuando se envía la petición por post, el servidor Tomcat no es capaz de saber cuál es el formato de codificación del cliente. Como posible solución está crear un filtro para que todas las peticiones pasen por él y donde se especifica que la request vaya en codificación UTF-8.

Añadimos el filtro al web.xml antes de la declaración de cualquier servlet.

4. Conclusión

Como podéis ver la codificación de caracteres no es nada trivial y afecta en muchas partes de nuestra aplicación web por lo que es algo a tener muy en cuenta a la hora de planificar un proyecto. Para evitarnos muchos problemas sobre todo cuando tenemos mucho código escrito hay que tener muy presente que nuestras páginas web serán accedidas desde diferentes sitios con distintos idiomas. Todo esto queda resuelto eligiendo un estándar en la codificación de los caracteres, en este caso UTF-8.

6 Comentarios

  1. En algunas versiones de Apache Tomcat es necesario añadir useBodyEncodingForURI=»true» a la configuración del conector para que tenga en cuenta la propiedad CharacterEncoding de la request.

  2. Muchas gracias por la explicación, me ha sido super útil.

    El fallo que comenta mluisa posiblemente sea porque después de la linea \\\»fc.doFilter( request, response );\\\» falta el cierre de llaves, es decir, \\\»}\\\» (sin comillas).

    Un saludo y gracias de nuevo.

  3. Hola
    el articulo es muy interesante, de hecho lo he aplicado en mi caso, pero por desgracia no funciono !
    por si teneis alguna sugerencia os comento mi caso.

    la app que estamos desarrollando es un visor de mapas y genera mapas en pdf al imprimir, en dos lenguas ingles y arabe, el problema es que en arabe no salen los labels ni nada enviado en forato string en arabe desde el servidor, mientras en mi llamada ajax todo se genera bien, lo que me sale en mi pdf son las letras en arabe pero con efecto espejo, un ejemplo en lugar de que sea en arabe, PATATA me da ATATAP obviamente en el caso de arabe es de derecha a la izquierda.
    uso mapfish printModule de geoserver. pero sospecho que es el tomcat8 que me esta haciendo este efecto…..pero sigo perdido y investigando.
    cualquier sugerencia sera de gran ayuda.
    Un saludo

Dejar respuesta

Please enter your comment!
Please enter your name here