icono_twiter icono LinkedIn
Juan Alonso Ramos

Consultor tecnológico de desarrollo de proyectos informáticos.

Ingeniero en Informática, especialidad en Ingeniería del Software

Puedes encontrarme en Autentia: Ofrecemos de servicios soporte a desarrollo, factoría y formación

Somos expertos en Java/J2EE

Ver todos los tutoriales del autor

Fecha de publicación del tutorial: 2007-02-16

Tutorial visitado 37.685 veces Descargar en PDF

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

15/02/2007

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

<Connector port="8080" maxHttpHeaderSize="8192" maxThreads="150" minSpareThreads="25"     maxSpareThreads="75" enableLookups="false" redirectPort="8443" acceptCount="100"     connectionTimeout="20000" disableUploadTimeout="true" URIEncoding="UTF-8"/>

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 el catalina.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.

      <!-- Filtro para codificación de caracteres en formato UTF-8 -->

    <filter>

          <filter-name>UTF8Filter</filter-name>

          <filter-class>com.autentia.tutoriales.UTF8Filter</filter-class>

          <init-param>

             <param-name>requestEncoding</param-name>

             <param-value>UTF-8</param-value>

        </init-param>

    </filter>

    <filter-mapping>

          <filter-name>UTF8Filter</filter-name>

          <url-pattern>/*</url-pattern>

    </filter-mapping>

 

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.



A continuación puedes evaluarlo:

Regístrate para evaluarlo

Por favor, vota +1 o compártelo si te pareció interesante

Share |
Anímate y coméntanos lo que pienses sobre este TUTORIAL:

Fecha publicación: 2013-11-12-03:52:11

Autor: lxMartinus

Gracias, muy útil la información.

Saludos

Fecha publicación: 2011-06-24-18:59:27

Autor: Luna

Excelente información, por fin se resolvió el problema de los acentos y eñes jaja ... Muchas Gracias por compartir el conocimiento ^_^

Fecha publicación: 2010-06-10-14:21:00

Autor: Morwen

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.

Fecha publicación: 2010-06-08-08:28:22

Autor: crisocean

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.

Fecha publicación: 2007-03-17-06:47:10

Autor:

[mluisa] Hola, quisiera saber porqué no funcionan las especificaciones de filtros aqui detalladas. Da un error que no condigo quitar. Si alguien lo ha conseguido agradecedía una ayuda. Gracias.