2009-05-31 18 views
7

Tengo un formulario html con varios campos de texto.Problemas de codificación en JSP

Cuando intento enviar caracteres no ingleses (en ruso en mi caso), el servidor recibe cadena "ilegible" (no preguntas - "???" pero algunos caracteres extraños).

he simplificado mi código para mostrar aquí:

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> 
<%@ page contentType="text/html;charset=UTF-8" language="java" %> 
<html> 
    <head><title>Simple jsp page</title></head> 
    <body> 
    <c:out value="${param.rustext}"/> 
    <form action="/test" method="post"> 
     <input type="text" name="rustext" width="30"> 
     <input type="submit" value="Submit"> 
    </form> 
    </body> 
</html> 

¿Cómo debo arreglar eso?

+2

Están sus encabezados de página en realidad enviando UTF-8 como la codificación? Consulte con algo como Fiddler –

+0

¿Y qué debo hacer si no lo están? – Roman

Respuesta

8

Tomcat usa ISO-8859-1 como la codificación de caracteres predeterminada para los parámetros de URL, independientemente de la codificación de la página que contiene la URL. Esto se puede cambiar con la configuración "URIEncoding" attribute in its Connector. Otros servidores de aplicaciones pueden tener configuraciones similares.

This article cubre muchos problemas comunes al trabajar con JSP.

+0

Sí, uso Tomcat. Gracias por el enlace, intentaré encontrar algo útil allí. – Roman

+0

Consulte http://tomcat.apache.org/tomcat-5.5-doc/config/http.html para conocer los detalles del atributo URIEncoding. – erickson

+1

Esta respuesta es * realmente * incorrecta. El OP estaba usando POST, no GET. – BalusC

0

Al usar POST, que es una codificación de uso obligatorio, el formulario se envía como tipo de contenido "application/x-www-form-urlencoded". Puede especificar el atributo de forma accept-charset = "UTF-8" para especificar su codificación.

+0

Ya lo he intentado y no funciona – Roman

3

Erickson lo explicó muy bien en esta página. Una solución independiente del servidor es usar un filtro de codificación de caracteres, à la org.springframework.web.filter.CharacterEncodingFilter. Consulte el siguiente ejemplo:

import java.io.IOException; 
import javax.servlet.Filter; 
import javax.servlet.FilterChain; 
import javax.servlet.FilterConfig; 
import javax.servlet.ServletException; 
import javax.servlet.ServletRequest; 
import javax.servlet.ServletResponse; 

public class EncodingFilter implements Filter { 
    private String encoding = "utf-8"; 
    public void doFilter(ServletRequest request, ServletResponse response, 
      FilterChain filterChain) throws IOException, ServletException { 
     request.setCharacterEncoding(encoding); 
     filterChain.doFilter(request, response); 
    } 
    public void init(FilterConfig filterConfig) throws ServletException { 
     String encodingParam = filterConfig.getInitParameter("encoding"); 
     if (encodingParam != null) { 
      encoding = encodingParam; 
     } 
    } 
    public void destroy() { 
     // nothing todo 
    } 
} 

En Web.xml añadir la declaración de filtro y el filtro de correlación de URL en las secciones correspondientes:

<filter> 
    <filter-name>EncodingFilter</filter-name> 
    <description> 
    <![CDATA[Changes the encoding of the request, in order to help the appserver to correctly interpret request params]]> 
    </description> 
    <filter-class>com.mypackage.EncodingFilter</filter-class> 
<init-param> 
    <param-name>encoding</param-name> 
    <param-value>ISO-8859-15</param-value> 
    </init-param> 
</filter> 


    <filter-mapping> 
     <filter-name>EncodingFilter</filter-name> 
     <url-pattern>/*</url-pattern> 
    </filter-mapping> 
+0

Tenga en cuenta que esto solo cubre el cuerpo de la solicitud, no la URL de solicitud. En otras palabras: esto establecerá la codificación para las solicitudes POST, no para las solicitudes GET. En el caso de las solicitudes GET, debe seguir jugando con la configuración de servletcontainer, como se indica en la respuesta de Erickson. – BalusC

+0

Correcto, no he pensado en la URL. –

0

Esto es lo mismo que Victor Ionescu propuso, pero no lo hace necesita escribir su propio filtro de codificación

Añadir el siguiente filtro para web.xml

<filter> 
    <filter-name>charsetFilter</filter-name> 
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> 
    <init-param> 
     <param-name>encoding</param-name> 
     <param-value>UTF-8</param-value> 
    </init-param> 
</filter> 

<filter-mapping> 
    <filter-name>charsetFilter</filter-name> 
    <url-pattern>*.admin</url-pattern> 
</filter-mapping> 
Cuestiones relacionadas