Cómo pasar caracteres Unicode como JSP / Servlet request.getParameter?

Después de muchas pruebas y errores, todavía no puedo resolver el problema. El JSP, el servlet y la base de datos están configurados para aceptar la encoding UTF-8, pero aún así cada vez que uso request.getParameter en cualquier cosa que tenga caracteres de dos bytes como el em dash, se mezclan como caracteres rotos.

He hecho envíos manuales a la base de datos y puede aceptar estos caracteres, no hay problema. Y si extraigo el texto de la base de datos en un servlet y lo imprimo en el formulario de mi página jsp, no muestra ningún problema.

La única vez que he encontrado que vuelve como caracteres rotos es cuando bash mostrarlo en otro lugar después de recuperarlo usando request.getParameter.

¿Alguien mas ha tenido este problema? ¿Cómo puedo arreglarlo?

Eso puede suceder si la encoding de solicitud y / o respuesta no está configurada correctamente.

Para las solicitudes GET, debe configurarlo en el nivel de servletcontainer. No está claro cuál es el que está usando, pero en el ejemplo de Tomcat se debe hacer mediante el atributo URIEncoding en el elemento en su /conf/server.xml .

  

Para las solicitudes POST, debe crear un filtro que esté asignado al patrón de URL deseado que cubra todas las solicitudes POST. Ej. *.jsp o incluso /* . Haz el siguiente trabajo en doFilter() :

 request.setCharacterEncoding("UTF-8"); chain.doFilter(request, response); 

Para las respuestas HTML y la encoding del lado del cliente de los valores de entrada del formulario HTML enviado, debe establecer la encoding de la página JSP. Agregue esto a la parte superior del JSP (probablemente ya lo haya hecho correctamente dado que mostrar el DB de forma recta UTF-8 funciona bien).

 <%@page pageEncoding="UTF-8" %> 

O para evitar copiar esto en cada JSP, configúralo una vez en web.xml :

   *.jsp UTF-8   

Para los archivos de código fuente y stdout (consola IDE), debe establecer la encoding del espacio de trabajo IDE. No está claro cuál de ellos está usando, pero en el ejemplo de Eclipse se debe hacer configurando Ventana> Preferencias> General> Espacio de trabajo> Codificación de archivo de texto en UTF-8.

enter image description here

Tenga en cuenta que las tags HTML se ignoran cuando la página se publica a través de HTTP. Solo se considera cuando la página se abre desde el sistema de archivos del disco local a través de file:// . También es innecesario especificar

ya que de manera predeterminada usa la encoding de respuesta utilizada durante el servicio de la página HTML con el formulario. Consulte también la especificación HTML W3 .

Ver también:

  • Unicode – Cómo obtener los personajes correctos?
  • ¿Por qué POST no respeta el juego de caracteres, pero una solicitud AJAX lo hace? tomcat 6
  • HTML: el formulario no envía entradas de formato UTF-8
  • Los caracteres Unicode en la aplicación de servlet se muestran como signos de interrogación
  • Mala encoding UTF-8 al escribir en la base de datos (la lectura es correcta)

Las preguntas frecuentes de Tomcat cubren este tema bastante bien. Particularmente: http://wiki.apache.org/tomcat/FAQ/CharacterEncoding#Q8 y http://wiki.apache.org/tomcat/FAQ/CharacterEncoding#Q4

El JSP de prueba que figura en las preguntas frecuentes es esencialmente el que utilicé cuando revisé Tomcat años atrás para solucionar varios problemas de encoding.

La respuesta de BalusC es correcta, pero solo quiero agregar que es importante (para el método POST por supuesto) que

 request.setCharacterEncoding("UTF-8"); 

se llama antes de leer cualquier parámetro. Así es como se implementa el parámetro de lectura:

 @Override public String getParameter(String name) { if (!parametersParsed) { parseParameters(); } return coyoteRequest.getParameters().getParameter(name); } 

Como puede ver, hay una bandera parametersParsed que se establece cuando lee cualquier parámetro por primera vez, el método parseParameters () analiza todos los parámetros de la solicitud y establece la encoding. Vocación:

 request.setCharacterEncoding("UTF-8"); 

después de que los parámetros fueron analizados no tendrán ningún efecto! Es por eso que algunas personas se quejan de que establecer la encoding de la solicitud no funciona. La mayoría de las respuestas aquí sugieren usar el filtro de servlet y establecer la encoding de caracteres allí. Esto es correcto pero también tenga en cuenta que algunas bibliotecas de seguridad pueden leer los parámetros de solicitud antes de su filtro (este era mi caso) así que si su filtro se ejecuta después de eso, la encoding de caracteres de los parámetros de solicitud ya está configurada y configurar UTF-8 o cualquier otro no tiene efecto

Solo quiero agregar un punto que en caso de que alguien más cometiera el mismo error que yo, cuando pasé por alto el método POST

Leí todas estas soluciones y las apliqué a mi código, pero aún no funcionó porque olvidé agregar method="POST" en mi etiqueta