especiales caracteres acentos java mysql tomcat encoding utf-8

java - acentos - jsp caracteres especiales



¿Cómo hacer que UTF-8 funcione en aplicaciones web de Java? (13)

Acerca de CharsetFilter mencionado en @kosoant answer ....

Hay una compilación en Filter en tomcat web.xml (ubicada en conf/web.xml ). El filtro se denomina setCharacterEncodingFilter y se comenta de forma predeterminada. Puede descomentar esto (Por favor, recuerde descomentar su filter-mapping también)

Además, no es necesario configurar jsp-config en su web.xml (lo he probado para Tomcat 7+)

Necesito que UTF-8 funcione en mi aplicación web de Java (servlets + JSP, no se utiliza ningún marco) para admitir äöå etc. para el texto finlandés normal y alfabetos cirílicos como ЦжФ para casos especiales.

Mi configuración es la siguiente:

  • Entorno de desarrollo: Windows XP
  • Ambiente de producción: Debian

Base de datos utilizada: MySQL 5.x

Los usuarios utilizan principalmente Firefox2, pero también se utilizan Opera 9.x, FF3, IE7 y Google Chrome para acceder al sitio.

¿Cómo lograr esto?


Algún tiempo usted puede resolver un problema a través del asistente de administrador de MySQL. En

Variables de inicio> Avanzadas>

y establecer def. conjunto de caracteres: utf8

Tal vez esta configuración necesite reiniciar MySQL.


Buena respuesta detallada. solo quería agregar una cosa más que definitivamente ayudará a otros a ver la codificación UTF-8 en las URL en acción.

Siga los pasos a continuación para habilitar la codificación UTF-8 en las URL en Firefox.

  1. escribe "about: config" en la barra de direcciones.

  2. Utilice el tipo de entrada de filtro para buscar la propiedad "network.standard-url.encode-query-utf8".

  3. la propiedad anterior será falsa por defecto, gire eso a VERDADERO.
  4. reinicie el navegador.

La codificación UTF-8 en las URL funciona de forma predeterminada en IE6 / 7/8 y chrome.


Creo que lo resumiste bastante bien en tu propia respuesta.

En el proceso de UTF-8-ing (?) De un extremo a otro, es posible que también desee asegurarse de que Java esté utilizando UTF-8. Utilice -Dfile.encoding = utf-8 como parámetro para la JVM (se puede configurar en catalina.bat).


En caso de que haya especificado en el grupo de conexiones (mysql-ds.xml), en su código Java puede abrir la conexión de la siguiente manera:

DriverManager.registerDriver(new com.mysql.jdbc.Driver()); Connection conn = DriverManager.getConnection( "jdbc:mysql://192.168.1.12:3308/mydb?characterEncoding=greek", "Myuser", "mypass");


Esto es para la codificación griega en tablas MySql cuando queremos acceder a ellas utilizando Java:

Use la siguiente configuración de conexión en su grupo de conexiones JBoss (mysql-ds.xml)

<connection-url>jdbc:mysql://192.168.10.123:3308/mydatabase</connection-url> <driver-class>com.mysql.jdbc.Driver</driver-class> <user-name>nts</user-name> <password>xaxaxa!</password> <connection-property name="useUnicode">true</connection-property> <connection-property name="characterEncoding">greek</connection-property>

Si no quiere poner esto en un grupo de conexiones JNDI, puede configurarlo como un JDBC-url como lo ilustra la siguiente línea:

jdbc:mysql://192.168.10.123:3308/mydatabase?characterEncoding=greek

Para Nick y para mí, para que nunca más lo olvidemos y perdamos el tiempo ...


Las respuestas anteriores no funcionaron con mi problema. Fue solo en producción, con tomcat y apache mod_proxy_ajp. Publicar cuerpo perdido por caracteres no ascii? El problema finalmente fue con JVM defaultCharset (US-ASCII en una instalación predeterminada: Charset dfset = Charset.defaultCharset ();), así que la solución se ejecutó en un servidor tomcat con un modificador para ejecutar la JVM con UTF-8 como juego de caracteres predeterminado:

JAVA_OPTS="$JAVA_OPTS -Dfile.encoding=UTF-8"

(agregue esta línea a catalina.sh y reinicie Tomcat)

Quizás también deba cambiar la variable del sistema de Linux (edite ~ / .bashrc y ~ / .profile para un cambio permanente, vea https://perlgeek.de/en/article/set-up-a-clean-utf8-environment )

exportar LC_ALL = en_US.UTF-8
export LANG = en_US.UTF-8

IDIOMA de exportación = en_US.UTF-8


Otro punto que no se ha mencionado se relaciona con los Servlets de Java que trabajan con Ajax. Tengo situaciones en las que una página web está recogiendo el texto utf-8 del usuario que lo envía a un archivo JavaScript que lo incluye en un URI enviado al Servlet. El Servlet consulta una base de datos, captura el resultado y lo devuelve como XML al archivo JavaScript que lo formatea e inserta la respuesta formateada en la página web original.

En una aplicación web, estaba siguiendo las primeras instrucciones de un libro Ajax para concluir el JavaScript en la construcción del URI. El ejemplo en el libro utiliza el método de escape (), que descubrí (la manera difícil) es incorrecto. Para utf-8 debes usar encodeURIComponent ().

Pocas personas parecen lanzar su propio Ajax en estos días, pero pensé que también podría agregar esto.


Para agregar a la respuesta de kosoant , si está utilizando Spring, en lugar de escribir su propio filtro de Servlet, puede usar la clase org.springframework.web.filter.CharacterEncodingFilter que proporcionan, configurándolo como sigue en su web.xml:

<filter> <filter-name>encoding-filter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> <init-param> <param-name>forceEncoding</param-name> <param-value>FALSE</param-value> </init-param> </filter> <filter-mapping> <filter-name>encoding-filter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>


Para mi caso de mostrar caracteres Unicode de paquetes de mensajes, no necesito aplicar la sección "Codificación de página JSP" para mostrar Unicode en mi página jsp. Todo lo que necesito es la sección "CharsetFilter".


También quiero agregar desde here esta parte solucionó mi problema utf:

runtime.encoding=<encoding>


Tengo un problema similar, pero, en los nombres de archivo de un archivo, estoy comprimiendo con apache commons. Entonces, lo resolví con este comando:

convmv --notest -f cp1252 -t utf8 * -r

funciona muy bien para mi Espero que ayude a alguien;)


Contestándome como las preguntas frecuentes de este sitio lo alienta. Esto funciona para mí:

La mayoría de los caracteres äåö no son problemáticos, ya que el conjunto de caracteres predeterminado utilizado por los navegadores y tomcat / java para webapps es latin1, es decir. ISO-8859-1 que "entiende" esos caracteres.

Para que UTF-8 funcione bajo Java + Tomcat + Linux / Windows + Mysql se requiere lo siguiente:

Configurando el server.xml de Tomcat

Es necesario configurar que el conector use UTF-8 para codificar los parámetros de la url (solicitud GET):

<Connector port="8080" maxHttpHeaderSize="8192" maxThreads="150" minSpareThreads="25" maxSpareThreads="75" enableLookups="false" redirectPort="8443" acceptCount="100" connectionTimeout="20000" disableUploadTimeout="true" compression="on" compressionMinSize="128" noCompressionUserAgents="gozilla, traviata" compressableMimeType="text/html,text/xml,text/plain,text/css,text/ javascript,application/x-javascript,application/javascript" URIEncoding="UTF-8" />

La parte clave es URIEncoding = "UTF-8" en el ejemplo anterior. Esto garantiza que Tomcat maneja todos los parámetros GET entrantes como UTF-8 codificado. Como resultado, cuando el usuario escribe lo siguiente en la barra de direcciones del navegador:

https://localhost:8443/ID/Users?action=search&name=*ж*

el carácter ж se maneja como UTF-8 y está codificado (generalmente por el navegador antes de llegar al servidor) como % D0% B6 .

La solicitud POST no se ve afectada por esto.

Filtro de caracteres

Entonces es hora de forzar la aplicación web java para manejar todas las solicitudes y respuestas como codificación UTF-8. Esto requiere que definamos un filtro de conjunto de caracteres como el siguiente:

package fi.foo.filters; import javax.servlet.*; import java.io.IOException; public class CharsetFilter implements Filter { private String encoding; public void init(FilterConfig config) throws ServletException { encoding = config.getInitParameter("requestEncoding"); if (encoding == null) encoding = "UTF-8"; } public void doFilter(ServletRequest request, ServletResponse response, FilterChain next) throws IOException, ServletException { // Respect the client-specified character encoding // (see HTTP specification section 3.4.1) if (null == request.getCharacterEncoding()) { request.setCharacterEncoding(encoding); } // Set the default response content type and encoding response.setContentType("text/html; charset=UTF-8"); response.setCharacterEncoding("UTF-8"); next.doFilter(request, response); } public void destroy() { } }

Este filtro se asegura de que si el navegador no ha establecido la codificación utilizada en la solicitud, se establece en UTF-8.

La otra cosa que hace este filtro es establecer la codificación de respuesta predeterminada, es decir. la codificación en la que se devuelve el html / lo que sea. La alternativa es establecer la codificación de respuesta, etc. en cada controlador de la aplicación.

Este filtro se debe agregar al web.xml o al descriptor de implementación de la aplicación web:

<!--CharsetFilter start--> <filter> <filter-name>CharsetFilter</filter-name> <filter-class>fi.foo.filters.CharsetFilter</filter-class> <init-param> <param-name>requestEncoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>CharsetFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>

Las instrucciones para hacer este filtro se encuentran en la wiki de tomcat ( http://wiki.apache.org/tomcat/Tomcat/UTF-8 )

Codificación de página JSP

En su web.xml , agregue lo siguiente:

<jsp-config> <jsp-property-group> <url-pattern>*.jsp</url-pattern> <page-encoding>UTF-8</page-encoding> </jsp-property-group> </jsp-config>

Alternativamente, todas las páginas JSP de la aplicación web deberían tener lo siguiente en la parte superior de ellas:

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

Si se utiliza algún tipo de diseño con diferentes fragmentos de JSP, esto es necesario en todos ellos.

HTML-meta tags

La codificación de la página JSP le dice a la JVM que maneje los caracteres en la página JSP en la codificación correcta. Entonces es hora de decirle al navegador en qué codificación está la página html:

Esto se hace con lo siguiente en la parte superior de cada página xhtml producida por la aplicación web:

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fi"> <head> <meta http-equiv=''Content-Type'' content=''text/html; charset=UTF-8'' /> ...

Conexión JDBC

Cuando se utiliza una base de datos, debe definirse que la conexión utiliza la codificación UTF-8. Esto se hace en context.xml o donde sea que la conexión JDBC esté definida de la siguiente manera:

<Resource name="jdbc/AppDB" auth="Container" type="javax.sql.DataSource" maxActive="20" maxIdle="10" maxWait="10000" username="foo" password="bar" driverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/ ID_development?useEncoding=true&amp;characterEncoding=UTF-8" />

Base de datos MySQL y tablas

La base de datos utilizada debe utilizar la codificación UTF-8. Esto se logra creando la base de datos con lo siguiente:

CREATE DATABASE `ID_development` /*!40100 DEFAULT CHARACTER SET utf8 COLLATE utf8_swedish_ci */;

Entonces, todas las tablas deben estar en UTF-8 también:

CREATE TABLE `Users` ( `id` int(10) unsigned NOT NULL auto_increment, `name` varchar(30) collate utf8_swedish_ci default NULL PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_swedish_ci ROW_FORMAT=DYNAMIC;

La parte clave es CHARSET = utf8 .

Configuración del servidor MySQL

MySQL serveri tiene que ser configurado también. Normalmente esto se hace en Windows modificando my.ini -file y en Linux configurando my.cnf -file. En esos archivos se debe definir que todos los clientes conectados al servidor utilicen utf8 como el conjunto de caracteres predeterminado y que el conjunto de caracteres predeterminado utilizado por el servidor también sea utf8.

[client] port=3306 default-character-set=utf8 [mysql] default-character-set=utf8

Mysql procedimientos y funciones

Estos también necesitan tener el conjunto de caracteres definido. Por ejemplo:

DELIMITER $$ DROP FUNCTION IF EXISTS `pathToNode` $$ CREATE FUNCTION `pathToNode` (ryhma_id INT) RETURNS TEXT CHARACTER SET utf8 READS SQL DATA BEGIN DECLARE path VARCHAR(255) CHARACTER SET utf8; SET path = NULL; ... RETURN path; END $$ DELIMITER ;

Peticiones GET: latin1 y UTF-8

Si y cuando se define en server.xml de tomcat que los parámetros de solicitud GET están codificados en UTF-8, las siguientes solicitudes GET se manejan correctamente:

https://localhost:8443/ID/Users?action=search&name=Petteri https://localhost:8443/ID/Users?action=search&name=ж

Debido a que los caracteres ASCII están codificados de la misma manera tanto con latin1 como con UTF-8, la cadena "Petteri" se maneja correctamente.

El carácter cirílico ж no se comprende en absoluto en latin1. Debido a que Tomcat recibe instrucciones para manejar los parámetros de solicitud como UTF-8, codifica ese carácter correctamente como % D0% B6 .

Cuando se indique a los navegadores que lean las páginas en codificación UTF-8 (con encabezados de solicitud y etiqueta meta html), al menos Firefox 2/3 y otros navegadores de este período codifican el carácter como % D0% B6 .

El resultado final es que se encuentran todos los usuarios con el nombre "Petteri" y también todos los usuarios con el nombre "ж".

Pero ¿qué pasa con äåö?

La especificación HTTP define que las URL predeterminadas están codificadas como latin1. Esto da como resultado que Firefox2, Firefox3, etc. codifiquen lo siguiente

https://localhost:8443/ID/Users?action=search&name=*Päivi*

en la versión codificada

https://localhost:8443/ID/Users?action=search&name=*P%E4ivi*

En latin1 el carácter ä se codifica como % E4 . A pesar de que la página / solicitud / todo está definido para usar UTF-8 . La versión codificada en UTF-8 de ä es % C3% A4

El resultado de esto es que es bastante imposible que la aplicación web maneje los parámetros de solicitud de las solicitudes GET, ya que algunos caracteres están codificados en latin1 y otros en UTF-8. Aviso: las solicitudes POST funcionan como los navegadores codifican todos los parámetros de solicitud de formularios completamente en UTF-8 si la página se define como UTF-8

Cosas para leer

Muchísimas gracias a los escritores de los siguientes por dar las respuestas a mi problema:

  • http://tagunov.tripod.com/i18n/i18n.html
  • http://wiki.apache.org/tomcat/Tomcat/UTF-8
  • http://java.sun.com/developer/technicalArticles/Intl/HTTPCharset/
  • http://dev.mysql.com/doc/refman/5.0/en/charset-syntax.html
  • http://cagan327.blogspot.com/2006/05/utf-8-encoding-fix-tomcat-jsp-etc.html
  • http://cagan327.blogspot.com/2006/05/utf-8-encoding-fix-for-mysql-tomcat.html
  • http://jeppesn.dk/utf-8.html
  • http://www.nabble.com/request-parameters-mishandle-utf-8-encoding-td18720039.html
  • http://www.utoronto.ca/webdocs/HTMLdocs/NewHTML/iso_table.html
  • http://www.utf8-chartable.de/

Nota IMPORTANTE

mysql admite el plano multilingüe básico con caracteres UTF-8 de 3 bytes. Si necesita salirse de eso (algunos alfabetos requieren más de 3 bytes de UTF-8), entonces debe usar un tipo de columna VARBINARY o usar el utf8mb4 caracteres utf8mb4 (que requiere MySQL 5.5.3 o posterior) ). Solo tenga en cuenta que usar el utf8 caracteres utf8 en MySQL no funcionará el 100% del tiempo.

Tomcat con apache

Una cosa más Si está utilizando Apache + Tomcat + mod_JK connector, entonces también necesita hacer los siguientes cambios:

  1. Agregue URIEncoding = "UTF-8" en el archivo tomcat server.xml para el conector 8009, se usa por el conector mod_JK. <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" URIEncoding="UTF-8"/>
  2. Vaya a su carpeta de apache, es decir, /etc/httpd/conf y agregue AddDefaultCharset utf-8 en el httpd.conf file . Nota: Primero compruebe que existe o no. Si existe puedes actualizarlo con esta línea. Puede agregar esta línea en la parte inferior también.