Me encontraba esta mañana trabajando sobre un proyecto desarrollado en Java haciendo uso de páginas JSP para las vistas, y me encontré con que al enviar un formulario no se insertaban bien en la base de datos los caracteres acentuados y las ñ, apareciendo otros extraños en su lugar. No era la primera vez que veía esto, era evidente que había un problema de codificación.
Lo primero fue comprobar que todas las páginas tuvieran definida en su cabecera la codificación adecuada:
<%@page contentType="text/html" pageEncoding="UTF-8"%>
Tras ver que eso estaba correctísimo, se me ocurre aplicar al principio del código, antes de recoger los resultados, la siguiente función:
request.setCharacterEncoding("UTF-8");
Y parecía que funcionaba, pero no. En principio en la mayoría de los casos eso soluciona el problema, pero a veces el Tomcat es puñetero (en mi caso estaba usando este servidor) y en algunas casuísticas decide que sigue cascando. Así que seguí buceando, y me encontré con que el problema está en que por defecto Tomcat interpreta los datos recibidos por POST como ISO-8859-1. Y había por medio un servlet funcionando como filtro que me escarallaba todo haciendo inútil el consejo anterior. Total, que fui a estudiarme la configuración del Tomcat, a ver si lo arreglaba definitivamente. Y así fue.
Lo primero es ir a la configuración de Tomcat y editar el archivo Server.xml, buscas allí el elemento Connector y en el valor de URIEncoding pones «UTF-8». Tras esto te vas a la carpeta WEB-INF de tu aplicación y allí editas web.xml, pegando este filtro antes que ningún otro:
<filter> <filter-name>Character Encoding Filter</filter-name> <filter-class>org.apache.catalina.filters.SetCharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>Character Encoding Filter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
Un último punto: ojito a servlets que puedan funcionar como filtros intermedios antes de llegar a vuestra página jsp, a librerías de generación de contenidos o a frameworks varios, que igual tenéis que configurarlos también (cada proyecto es un mundo, pero por ejemplo con Velocity o Freemarker tendríais que configurarlos para UTF-8).
Muchas gracias, me sirvió de mucho. aunque no tuve que configurar nada en tomcat sera por la versión que no encontré el URIEencoding.
Solo tuve que anteponer antes de recoger los parámetros del formulario request.setCharacterEncoding(«utf-8»); y eso fue todo.