2009-05-31 9 views
7

Ho un modulo html con diversi campi di testo.Problemi di codifica in JSP

Quando provo a inviare caratteri non inglesi (russo nel mio caso) il server riceve una stringa "illeggibile" (non domande - "???" ma alcuni caratteri strani).

ho semplificato il mio codice per mostrare qui:

<%@ 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> 

Come dovrei rimediare?

+2

sono i tuoi intestazioni realtà l'invio di UTF-8 come codifica? Verificare con qualcosa come Fiddler –

+0

E cosa dovrei fare se non lo sono? – Roman

risposta

8

Tomcat utilizza ISO-8859-1 come codifica carattere predefinita per i parametri URL, indipendentemente dalla codifica della pagina che contiene l'URL. Questo può essere modificato con la configurazione "URIEncoding" attribute in its Connector. Altri server applicazioni potrebbero avere impostazioni simili.

This article copre molti problemi che si verificano comunemente quando si lavora con JSP.

+0

Sì, uso Tomcat. Grazie per il link, cercherò di trovare qualcosa di utile lì. – Roman

+0

Vedere http://tomcat.apache.org/tomcat-5.5-doc/config/http.html per le specifiche dell'attributo URIEncoding. – erickson

+1

Questa risposta è * effettivamente * errata. L'OP stava usando POST, non GET. – BalusC

0

Quando si utilizza il POST, che è un must usare la codifica, il modulo viene inviato come tipo di contenuto "application/x-www-form-urlencoded". È possibile specificare l'attributo form accept-charset = "UTF-8" per specificare la codifica.

+0

Ho già provato e non funziona – Roman

3

Erickson lo ha spiegato molto bene in questa pagina. Una soluzione indipendente dal server consiste nell'utilizzare un filtro di codifica dei caratteri, à la org.springframework.web.filter.CharacterEncodingFilter. Vedere il seguente esempio:

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 
    } 
} 

in web.xml aggiungere la dichiarazione di filtro e la mappatura del filtro URL in sezioni appropriate:

<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

Si noti che questo copre solo il corpo della richiesta, non l'URL della richiesta. In altre parole: questo imposterà la codifica per le richieste POST, non per le richieste GET. Per le richieste GET è ancora necessario armeggiare con la configurazione del servlet, come indicato nella risposta di Erickson. – BalusC

+0

Giusto, non ho pensato all'URL. –

0

questo è lo stesso come proposto Victor Ionescu, ma non è così è necessario scrivere il proprio filtro di codifica.

Aggiungere la seguente filtro per 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>