2012-06-07 27 views
5

Estoy desarrollando una aplicación web simple usando java/jsp/tomcat/mysql, y el mayor problema radica en la codificación de caracteres porque necesito lidiar con la codificación UTF-8 en lugar del 8851 predeterminadoproblema de codificación java tomcat utf-8

En primer lugar, me gustaría describir la estructura de mi programa. Estoy usando un servlet llamado Controller.java para manejar todas las solicitudes. Entonces, en web.xml, tengo un servlet de controlador que toma todas las solicitudes de * .do.

Luego, este controlador enviará la solicitud en función de la URL solicitada, por ejemplo, si el cliente solicita register.do, Controller enviará la solicitud a Register.java.

Y en el Register.java, hay un método que toma como parámetro de la solicitud, a saber:

public String perform(HttpServletRequest request) { 
    do something with the request... 
} 

Así que el problema es que si quiero imprimir algo en UTF-8 dentro de este método, dará caracteres aleatorios. Por ejemplo, tengo un Enum que almacena varias constantes, una de las propiedades que Enum tiene es su nombre en chino tradicional. Si lo imprimo en

public static void main(Stirng[] args{ 
    System.out.println(MyEnum.One.getChn()); 
    logger.info(MyEnum.One.getChn()); 
} 

Esto está impreso correctamente en chino. Sin embargo, si pongo el código exacto dentro del método de tratar con HttpServletRequest:

public String perform(HttpServletRequest request) { 
    System.out.println(MyEnum.One.getChn()); 
    logger.info(MyEnum.One.getChn()); 
} 

Ellos se imprimen como caracteres aleatorios, pero se pueden ver desde la ventana de depuración (eclipse) que las variables son la celebración de los caracteres chinos correctos.

Entonces, la misma situación ocurre cuando quiero almacenar el valor de request.getParameter(). En la ventana de depuración, puedo ver que la variable contiene los caracteres correctos, pero una la imprimo o intento almacenarla en la base de datos, son caracteres aleatorios.

No sé por qué el comportamiento actúa así, y esto me impide leer los valores de formulario enviados y almacenarlos en la base de datos. ¿Podría alguien dar algunas pistas sobre esto?

Gracias.

+1

No puedo entender si usted está preocupado acerca de la salida corrompido en la consola y los registros del servidor, * o * Salida corrompido en el respuesta resultante al navegador. ¿Puedes aclarar? – erickson

+2

¿Cuál es el valor de 'System.getProperty (" file.encoding ")'? – erickson

+0

Lo que me preocupa es que en la ventana de depuración puedo ver la codificación correcta, pero cuando paso la variable a mi objeto de acceso a la base de datos y la almacena en el archivo db, se convierten en caracteres aleatorios. Entonces, encontré que en el método de tratar con solicitudes, incluso simplemente imprimir UTF-8, el valor de Enum no funciona. –

Respuesta

5

Si es necesario utilizar codificación UTF-8 (y en realidad, todo el mundo debería estar pasando esto en estos días), entonces se puede seguir el "UTF-8 en todas partes COMO" que se encuentra en el FAQ Tomcat:

http://wiki.apache.org/tomcat/FAQ/CharacterEncoding#Q8

Recuerde que también necesita admitir UTF-8 en los campos de texto de su base de datos.

Asimismo, recuerda que a veces la "impresión" de una cadena con caracteres no ASCII en un archivo de registro o en la consola puede ser afectada por

  1. La codificación de caracteres de la corriente de salida
  2. La codificación de caracteres del lector de archivos (por ejemplo, cat/menos/vi)
  3. la codificación de caracteres del terminal

Usted puede ser mejor escribir los valores en un archivo y luego usando un edi hexagonal para examinar el contenido y asegurarse de obtener los valores de byte que está buscando.

+0

UTF-8 en todas partes en Eclipse: [Unicode/UTF-8 en sus proyectos Eclipse Java] (http://stijndewitt.wordpress.com/2010/05/05/unicode-utf-8-in-eclipse-java/) –

8

Aquí es un pequeño tutorial lo que hay que hacer para que UTF-8 trabajo en su aplicación web:

Hay que aplicar filtro en su aplicación para la codificación de caracteres:

public class CharacterEncodingFilter implements Filter { 

    @Override 
    public void init(FilterConfig filterConfig) 
      throws ServletException { 

    } 

    @Override 
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) 
      throws IOException, ServletException { 
     servletRequest.setCharacterEncoding("UTF-8"); 
     servletResponse.setContentType("text/html; charset=UTF-8"); 
     filterChain.doFilter(servletRequest, servletResponse); 
    } 

    @Override 
    public void destroy() { 

    } 
} 

Tienes para asegurarse de que el elemento de conector de archivo de tomcat server.xml tiene el atributo URIEncoding cuyo valor es UTF-8.

<Connector port="8080" 
      protocol="HTTP/1.1" 
      connectionTimeout="20000" 
      URIEncoding="UTF-8" 
      redirectPort="8443"/> 

También es necesario que especifique esto en cada página JSP:

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

En realidad, en lugar del filtro, creo que puede poner esto en su JSP: '<% @ page language =" java "contentType =" text/html; charset = UTF-8 "pageEncoding =" UTF-8 "%> ' –