Cómo pasar caracteres Unicode como JSP/Servlet request.getParameter?
servlets character-encoding (4)
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 codificación.
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 codificación 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 intento mostrarlo en otro lugar después de recuperarlo usando request.getParameter.
¿Alguien mas ha tenido este problema? ¿Cómo puedo arreglarlo?
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 codificación. 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 codificación de la solicitud no funciona. La mayoría de las respuestas aquí sugieren usar el filtro de servlet y establecer la codificación 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 codificación de caracteres de los parámetros de solicitud ya está configurada y configurar UTF-8 o cualquier otro no tiene efecto
Eso puede suceder si la codificación 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 <Connector>
en su /conf/server.xml
.
<Connector ... URIEncoding="UTF-8">
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 codificación del lado del cliente de los valores de entrada del formulario HTML enviado, debe establecer la codificación 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-config>
<jsp-property-group>
<url-pattern>*.jsp</url-pattern>
<page-encoding>UTF-8</page-encoding>
</jsp-property-group>
</jsp-config>
Para los archivos de código fuente y stdout (consola IDE), debe establecer la codificación 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.
Tenga en cuenta que las etiquetas HTML <meta http-equiv>
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 <form accept-charset>
ya que de manera predeterminada usa la codificación 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 codificación UTF-8 al escribir en la base de datos (la lectura es correcta)
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 <form>