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

6
69156

Í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.

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

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:

(Windows) set CATALINA_OPTS=-Dfile.encoding="UTF-8"

(Linux) export CATALINA_OPTS=-Dfile.encoding="UTF-8"

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

(Windows) set JAVA_OPTS=%JAVA_OPTS% -Dfile.encoding="UTF-8"

(Linux) export JAVA_OPTS=%JAVA_OPTS% -Dfile.encoding="UTF-8"

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.

package com.autentia.tutoriales;
      import java.io.IOException;
      import javax.servlet.Filter;
      import javax.servlet.FilterChain;
      import javax.servlet.FilterConfig;
      import javax.servlet.ServletException;
      import javax.servlet.ServletRequest;
      import javax.servlet.ServletResponse;
      /**
      * Filtro para que la aplicación acepte codificación en formato UTF-8
      */
      public class UTF8Filter implements Filter {
            private String encoding;
            /**
            * Recogemos el tipo de codificación definido en el web.xml
            * Si no se hubiera especificado ninguno se toma "UTF-8" por defecto
            */
            public void init( FilterConfig filterConfig ) throws ServletException {
                  encoding = filterConfig.getInitParameter( "requestEncoding" );
                  if( encoding == null ) {
                        encoding = "UTF-8";
                  }
            }
            /**
            * Metemos en la request el formato de codificacion UTF-8
            */
            public void doFilter( ServletRequest request, ServletResponse response, FilterChain fc )
                  throws IOException, ServletException {
                        request.setCharacterEncoding( encoding );
                        fc.doFilter( request, response );
           
            public void destroy() {}
    }

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


    
          UTF8Filter
          com.autentia.tutoriales.UTF8Filter
          
             requestEncoding
             UTF-8
        
    
    
          UTF8Filter
          /*
    

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

DEJA UNA RESPUESTA

Por favor ingrese su comentario!

He leído y acepto la política de privacidad

Por favor ingrese su nombre aquí

Información básica acerca de la protección de datos

  • Responsable:
  • Finalidad:
  • Legitimación:
  • Destinatarios:
  • Derechos:
  • Más información: Puedes ampliar información acerca de la protección de datos en el siguiente enlace:política de privacidad