Continuum

Continuum

Continuum Chile: Agilistas y Desarrolladores Web en Java, Ruby, Rails ..Java, Python, Ruby, Javascript, Ajax, Web 2.0, ESB, SOA…
Continuum

Generar una respuesta JSON desde Java en UTF-8

He visto en varios forums que algunas personas se quejan de que cuando generan objetos en notación JavaScript (JSON) y que tienen caracteres del latín como los acentados (ñ, á, ü, etc) usando HttpServletResponse desde un servlet el browser les muestra caracteres extraños y preguntan por la solución.

La respuesta es sencilla. Antes de hacer el getWriter() del HttpServletResponse se debe setear el tipo de encoding que usarán para mapear los caracteres de forma que el browser los pueda interpretar y convertir de vuelta.

Hay dos formas de hacer esto:

1. Mediante el método setContentType(), que envía el tipo de contenido al cliente (browser) y donde puede setearse el charset.

response.setContentType("application/x-json;charset=UTF-8");
...

2. Mediante el método setCharacterEncoding(), que si es usado sobre-escribe la acción de setContentType().

response.setCharacterEncoding("UTF-8");
...

A continuación un ejemplo completo del envio de modelos de objetos en notación JavaScript hacia el browser desde un clase que hereda de org.springframework.web.servlet.view.AbstractView de Spring

...
    protected void renderMergedOutputModel(Map model, HttpServletRequest req,
            HttpServletResponse resp) throws Exception {
        JSONObject json = (JSONObject) model.get("json");
        resp.setCharacterEncoding("UTF-8");
        if (null != json) {
            resp.getWriter().write(json.toString());
        } else {
            resp.getWriter().write("{}");
        }
    }

Para mayor referencia, Tim Bray explica porque Unicode y UTF-8 son excelentes. Es una lectura obligatoria para entender de estos temas.

UTF-8 encoding en Websphere Application Server

Escenario

Una aplicación Web J2EE ejecutandose en un cluster WAS 6.0 (WebSphere Application Server) en un cliente nuestro.

El problema

La aplicación recoge datos en un formulario web y los guarda en una BD. Pero los caracteres especiales del español tal como las letras acentuadas (ñ, á, é, etc) eran insertados como basura en la BD.

Solución

Revisamos los parámetros de la JVM del servidor de aplicaciones y notamos que por default viene configurada para usar ISO-8859-1 sobre-escribiendo el charset encoding que viene desde cliente. La propiedad es:

-Dclient.encoding.override=ISO-8859-1

Entonces, cambiamos el parámetro para obligar a la JVM a usar UTF-8 y listo, se solucionó el problema.

Los pasos que seguimos para hacer el cambio desde la consola de administración del WAS 6.0 fueron:

  1. Seleccionar “Applications Servers”
  2. Seleccionar “Java and Process Management” (dentro de la seccion Server Infrastructure) –> “Process Definition”
  3. Seleccionar “Java Virtual Machine” (dentro de la seccion Additional Properties)
  4. Seleccionar “Add data in Generic JVM arguments” (seguramente viene seteado como -Dclient.encoding.override=ISO-8859-1)
  5. Presionar “Save”.
  6. Reniciar el servidor de aplicaciones.

UTF-8

Unicode es un estándar industrial que consiste en un repertorio de más de 100.000 caracteres que permite representar y manipular texto escrito en la mayoría de los lenguajes existentes.

UTF-8 (8-bit UCS/Unicode Transformation Format) es un formato de tamaño variable para representar los caracteres Unicode, y que al ser compatible con el antiguo ASCII es el protocolo de encoding preferido por muchas aplicaciones como clientes de mail, y páginas web.

En esto radicaba nuestro problema, el browser enviaba al servidor de aplicaciones la petición HTTP (REQUEST) usando UTF-8 como character encoding, sin embargo en el servidor estaba seteada la sytem property (-Dclient.encoding.override) que manda a sobre-escribir el mecanismo de encoding del cliente, usando ISO-8859-1, por tanto las tablas de interpretación y transformación usadas eran diferentes y el servidor interpretaba de forma incorrecta los array de bytes en formato UTF-8 enviando representaciones de caracteres estraños a la Base de Datos.

Tim Bray explica porque Unicode y UTF-8 son excelentes, es una lectura obligatoria para entender de estos temas.

 
Copyright © 2012 Continuum Ltda. Coronel Pereira 72. Oficina 903. Las Condes. Santiago. Chile
Tel: +56 2 9341951