Saltar al contenido

¿Cómo hacer que UTF-8 funcione en aplicaciones web Java?

Hola, encontramos la respuesta a tu interrogante, has scroll y la obtendrás más abajo.

Solución:

Responderme a mí mismo como las preguntas frecuentes de este sitio lo alienta. Esto funciona para mi:

La mayoría de los caracteres äåö no son un problema, ya que el conjunto de caracteres predeterminado utilizado por los navegadores y tomcat / java para aplicaciones web es latin1, es decir. ISO-8859-1 que “entiende” esos caracteres.

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

Configuración de server.xml de Tomcat

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


los key ser parte URIEncoding = “UTF-8” en el ejemplo anterior. Esto garantiza que Tomcat maneja todos los parámetros GET entrantes con codificación UTF-8. 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 incluso de llegar al servidor) como % D0% B6.

La solicitud POST no se ve afectada por esto.

CharsetFilter

Entonces es el momento de forzar a la aplicación web de Java a manejar todas las solicitudes y respuestas codificadas en UTF-8. Esto requiere que definamos un filtro de juego 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 configurado la codificación utilizada en la solicitud, esté configurada 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 configurar la codificación de respuesta, etc. en cada controlador de la aplicación.

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

  

  
    CharsetFilter
    fi.foo.filters.CharsetFilter
      
        requestEncoding
        UTF-8
      
  

  
    CharsetFilter
    /*
  

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 tus web.xml, agregue lo siguiente:


    
        *.jsp
        UTF-8
    

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

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

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

HTML-metaetiquetas

La codificación de la página JSP le dice a la JVM que maneje los caracteres en la página JSP con la codificación correcta. Entonces es el momento 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:

   
   
   
   
   
   ...

Conexión JDBC

Cuando se usa una base de datos, se debe definir que la conexión usa codificación UTF-8. Esto se hace en context.xml o donde se defiende la conexión JDBC de la siguiente manera:

      

Base de datos y tablas MySQL

La base de datos utilizada debe utilizar 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;

los key ser parte CHARSET = utf8.

Configuración del servidor MySQL

MySQL serveri también debe configurarse. Normalmente, esto se hace en Windows modificando my.ini -archivo y en Linux configurando my.cnf -expediente. En esos archivos debe definirse que todos los clientes conectados al servidor usan utf8 como el juego de caracteres predeterminado y que el juego de caracteres predeterminado usado por el servidor también es utf8.

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

   [mysql]
   default-character-set=utf8

Procedimientos y funciones de mysql

Estos también deben tener definido el juego de caracteres. 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 ;

Solicitudes GET: latin1 y UTF-8

Si y cuando se define en el 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, el string “Petteri” se maneja correctamente.

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

Si se indica a los navegadores que lean las páginas en codificación UTF-8 (con encabezados de solicitud y metaetiqueta 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 se encuentran todos los usuarios con el nombre “ж”.

Pero ¿qué pasa con äåö?

La especificación HTTP define que, por defecto, las URL 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 personaje a está codificado como % E4. Aunque 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 para la aplicación web manejar correctamente 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 ya que los navegadores codifican todos los parámetros de solicitud de los formularios completamente en UTF-8 si la página se define como UTF-8

Cosas para leer

Un gran agradecimiento a los escritores de lo siguiente 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 utilizando caracteres UTF-8 de 3 bytes. Si necesita salirse de eso (ciertos alfabetos requieren más de 3 bytes de UTF-8), entonces debe usar un sabor de VARBINARY tipo de columna o utilice el utf8mb4 juego de caracteres (que requiere MySQL 5.5.3 o posterior). Solo tenga en cuenta que el uso de utf8 el juego de caracteres en MySQL no funcionará el 100% del tiempo.

Tomcat con Apache

Una cosa más si está utilizando el conector Apache + Tomcat + mod_JK, también debe realizar los siguientes cambios:

  1. Agregue URIEncoding = “UTF-8” en el archivo tomcat server.xml para el conector 8009, lo usa el conector mod_JK.
  2. Vaya a su carpeta apache, es decir /etc/httpd/conf y añadir AddDefaultCharset utf-8 en httpd.conf file. Nota: Primero verifique que exista o no. Si existe, puede actualizarlo con esta línea. También puede agregar esta línea en la parte inferior.

Creo que lo resumió bastante bien en su 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é usando UTF-8. Utilice -Dfile.encoding = utf-8 como parámetro para la JVM (se puede configurar en catalina.bat).

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

 
    encoding-filter
    org.springframework.web.filter.CharacterEncodingFilter
    
       encoding
       UTF-8
    
    
       forceEncoding
       FALSE
    
 
 
    encoding-filter
    /*
 

Te mostramos las comentarios y valoraciones de los usuarios

¡Haz clic para puntuar esta entrada!
(Votos: 2 Promedio: 5)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *