HttpServletRequest – setCharacterEncoding parece no hacer nada

Estoy tratando de leer información UTF-8 de la solicitud. Usé “request.setCharacterEncoding (” UTF-8 “);”, pero parece que no hace nada, la información leída no es UTF-8.

¿Qué estoy haciendo mal?

Si está utilizando tomcat, también debe configurar URIEncoding a UTF-8 en sus conectores:

 ...        

El HttpServletRequest#setCharacterEncoding() solo tiene efecto cuando la solicitud es una solicitud POST y el cuerpo de la solicitud aún no se procesa.

Entonces, si no funciona en su caso, puede tener dos causas:

  1. En realidad estás disparando una solicitud GET . Es decir, los parámetros de solicitud se envían de cliente a servidor en la URL de solicitud en lugar del cuerpo de la solicitud. La URL de solicitud es procesada por el servidor web, no por la API de Servlet. Entonces, para solucionar esto, necesita configurar el servidor web en cuestión para decodificar el URL de solicitud (URI) usando la encoding de caracteres especificada. En el caso de, por ejemplo, Apache Tomcat, debe establecer el atributo URIEncoding del elemento en server.xml en UTF-8 .

  2. Está utilizando correctamente POST , pero ya ha procesado (indirectamente) el cuerpo de la solicitud para que sea demasiado tarde para cambiar la encoding de caracteres. El cuerpo de la solicitud se procesará por completo solo cuando se getParameterXXX() la primera llamada en un método getParameterXXX() . Hay varios de ellos. No se volverá a procesar en llamadas posteriores. Al determinar quién llama a este método, no olvide incluir todas las instancias de Filter declaradas en web.xml . Algunos de ellos pueden tomar y escanear los parámetros.

Si eso todavía no ayuda, la única causa posible es que la consola de visualización o el registrador o lo que sea que esté utilizando para imprimir / determinar / depurar el parámetro de solicitud obtenido no es compatible con UTF-8. Le gustaría reconfigurar la consola / registrador / etc para usar UTF-8 en su lugar para mostrar los caracteres. Si es, por ejemplo, la consola de Eclipse, puede configurarla desde Ventana> Preferencias> General> Espacio de trabajo> Codificación de archivo de texto .

Ver también:

  • Unicode – Cómo obtener personajes ¿verdad? Más información general, ejemplos prácticos y soluciones.

este método es realmente estúpido. no debería estar allí, y no deberías usarlo.

para un cuerpo en una solicitud POST, la encoding debería haber sido explícitamente definida por el cliente en el encabezado Content-Type. si no, es una mala solicitud. [1]

para un URI de solicitud GET, el cliente no puede especificar la encoding, y el servidor debe tener una encoding implícita, y el progtwigdor necesita establecer la encoding, ¡pero ese método no existe en la API de Servlet!

sin embargo, el contenedor de servlets podría tener una forma patentada de hacerlo.

probablemente la mejor manera sea establecer la encoding predeterminada de su JVM en UTF-8.

1: http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.7.1

El parámetro “charset” se usa con algunos tipos de medios para definir el conjunto de caracteres (sección 3.4) de los datos. Cuando el remitente no proporciona ningún parámetro de juego de caracteres explícito, los subtipos de medios del tipo “texto” se definen para que tengan un valor predeterminado de juego de caracteres “ISO-8859-1” cuando se reciben a través de HTTP. Los datos en juegos de caracteres que no sean “ISO-8859-1” o sus subconjuntos DEBEN etiquetarse con un valor de juego de caracteres apropiado.

El problema depende de qué servidor de aplicaciones se utiliza. La mejor descripción, que encontré en este enlace .

En algunos servidores de aplicaciones, request.setCharacterEncoding(...) no tiene ningún efecto hasta que configure la encoding de la aplicación utilizando un descriptor. Los más complicados son JBoss, Apache Tomcat, Glassfish. Mejor es WebLogic, lo mejor es Jetty (UTF-8 es la configuración predeterminada).

En mi caso, debo crear un descriptor glassfish-web.xml y poner allí la etiqueta de parameter-encoding . En mi caso, para GlassFish:

     

Solo para confirmar que para los parámetros POST debe llamar a request.setCharacterEncoding(...) antes de obtener los parámetros. Y para los parámetros GET, depende del contenedor web que esté usando (use la respuesta de Maurice Perry para Tomcat).

Por favor, consulte este enlace para más información. “Conversiones de caracteres desde el navegador a la base de datos” http://java.sun.com/developer/technicalArticles/Intl/HTTPCharset/

lo estás haciendo después de cualquier llamada request.getParameter.

request.setCharacterEncoding("UTF-8") debe invocarse antes de cualquier llamada a request.getParameter() .

(en cuanto a la primera pregunta …)
si lee los parámetros del cuerpo, también es posible leer cada elemento con su propia encoding (busque en la última línea):

 ServletFileUpload upload = new ServletFileUpload(new DiskFileItemFactory()); List items = null; try { items = upload.parseRequest(request); } catch (FileUploadException ex) { logger.warn("Fail during file upload"); return uploads; } Iterator itr = items.iterator(); while (itr.hasNext()) { FileItem item = (FileItem) itr.next(); if (item.isFormField()) { String name = item.getFieldName(); System.out.println("name: " + name); String value = item.getString(); System.out.println("get as utf8 - "+item.getString("UTF-8")); 

para jboss / wildfly hay una solicitud de función https://issues.jboss.org/browse/WFLY-2533

Suelte esto en WEB-INF / jboss-web.xml:

 < ?xml version="1.0" encoding="UTF-8"?>   UTF-8