domingo, 22 de enero de 2012

Problema codificación de caracteres con JSP y MySql (tildes y eñes)

Desarrollando una sitio con JSP (aplicación web java) y acceso a una base de datos Mysql, ya terminando la aplicación al ser montada en un servidor la probé y me surgió el problema de que cuando ingresaba una tilde o una eñe en la base de datos no se almacenaban correctamente me surgían unos símbolos extraños almacenados y por lógica al ser consultados salían de la misma forma. es decir:

Ingresaba en un campo de texto APLICACIÓN y en la base de datos me almacenaba algo como esto APLICACIóN, y en el caso de MAÑANA me guardaba MAñANA.

Lo primero de todo revise las codificaciones de caracteres tanto de la base de datos como de las paginas JSP, en la base de datos Mysql tenia el character set = utf-8 la misma codificación que en las paginas JSP tenia las siguientes lineas que codifican esto:

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

Y la que va dentro de la etiqueta META dentro del HEAD, en la cual debe estar content="text/html; charset=UTF-8":

Luego toco recurrir al de siempre Google donde encontré información de todo desde modificar el servidor Tomcat hasta crear lineas de códigos que transformar los caracteres a la codificación deseada. El problema es que modificar el servidor Tomcat siempre sera un problema una por complejidad y otra por poca información especialmente en español (maldito ingles) y el otro de ingresar lineas de código que transforman los caracteres es un poco ambiguo, aquí les dejo una de las listas de las posibles soluciones que encontré:
Cabe recalcar que para obtener los datos de los formularios después de hacer el submit ocupo servlets y pensé ver desde ahí cual es el problema y descubrí que con la funcion request.getParameter() antes de almacenarlos en la base de datos obtiene los datos de forma incorrecta, entonces la base de datos esta bien, luego buscando información sobre esta función (REQUEST) en el sitio de java encontré la subfunción setCharacterEncoding la solución a mi problema ya que esta permite setear la codificación de caracteres para los datos que recibe del submit.
Entonces lo que hice fue dentro de los servlets que llamo para los submits de formularios ingresar esta linea de código antes de hacer cualquier obtención u operación de datos de la siguiente manera:

protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
request.setCharacterEncoding("UTF-8");
//luego el resto de codigo donde se realiza calculos
//o donde se almacenara en la base de datos
}

Talves la solución no sea tan optima pero me funciono y es mas rápida y sencilla que otras, agregando esa linea todos los servlets ya pude almacenar correctamente en mi base de datos mysql las tildes y las eñes, que son muy usudas en el español especialmente la tilde.

10 comentarios:

Jose dijo...

Excelente, muchas gracias lo necesitaba urgente.

Es importante destacar que si además estamos almacenando texto en una BD MYSQL, ésta debe especificar CHARSET=latin1 COLLATE=latin1_spanish_ci;

Pablo Torres Diaz dijo...

de nada Jose siempre son muy utiles esta clase de informacion, y muy buena aclaracion con respecto a la base de datos MySql, mas adelante pondre mas informacion con respecto a temas similares.

saludos...

Unknown dijo...

Muchas gracias por este post. Ya me tenia loco este problema. :D

Skaineitor dijo...

Muchas gracias, me has salvado de una... :D

scobosq dijo...

Gracias, totales!

Unknown dijo...

muy bueno y sin darle vueltas. Excelente aporte!!!

Unknown dijo...

Es la información más sencilla y útil que he encontrado en horas de búsqueda.
Muchas gracias por el aporte!!!

Unknown dijo...

Gran aporte y también en este aprendí a usarlo
https://youtu.be/7ChMe8Au2-g

Joaquín dijo...

Excelente mi amigo muy buena apreciación, la verdad si antes de hacer los request que recolecta cada text por ejm de un archivo HTML, hay que colocar esa expresion request.setCharacterEncoding("UTF-8");

Muchas gracias!!!

Unknown dijo...

Sos el 1!!! me re salvaste