2010-11-28 7 views
0

Ich behalte einige Probleme mit der Codierung von Daten in JSP-Seite (ich verwende eine Spring-MVC). Es sieht wie folgt aus:Jsp Seitencodierung Problem

<%@page contentType="text/html" pageEncoding="UTF-8"%> 

<% 
    response.setHeader("Cache-Control", "no-cache"); //HTTP 1.1 
    response.setHeader("Pragma", "no-cache"); //HTTP 1.0 
    response.setDateHeader("Expires", 0); 
    response.setCharacterEncoding("UTF-8"); 
    request.setCharacterEncoding("UTF-8"); 
%> 

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %> 

..... 
<form method="post">    
     <input type="text" name="txt" value="${Name}" /> 
     <input type="submit" value= OK /> 
</form> 

........ 

Meine app nimmt einen Text aus Texteingabefeld und schreiben Sie es auf die Datenbank (HSQLDB). Wenn ich englische Buchstaben verwende, um Daten zu schreiben, funktioniert alles gut! Aber wenn ich versuche, russische Buchstaben im Eingabefeld zu verwenden, schreibe ich seltsame Buchstaben in falscher Kodierung. Wie vermeide ich dieses Problem?

Irgendwelche Ideen?

+1

Ihr 'Cache-Control'-Eintrag ist übrigens [unvollständig] (http://stackoverflow.com/questions/49547/making-sure-a-web-page-is-not-cached-across-all- Browser/2068407 # 2068407). Es funktioniert unter anderem nicht in Firefox. Auch die beiden 'setCharacterEncoding()' Aufrufe sind überflüssig, da es für die 'request'-Datei zu spät ist und Sie bereits die' pageEncoding' gesetzt haben, die bereits implizit die 'response'-Funktion übernimmt. – BalusC

+0

Oh ... Ich wusste es nicht. So kann ich Zeilen response.setCharacterEncoding ("UTF-8") entfernen; request.setCharacterEncoding ("UTF-8"); ? Ich habe versucht, diese Zeile hier zu setzen, um Probleme mit der Codierung zu lösen. Aber alles hat nicht funktioniert, bis axtavt gibt mir keine Lösung mit Spring Encoding Filter. – Ilnur

+1

Wie gesagt, es ist * zu spät * um es auf die Anfrage einzustellen. Es wurde bereits verarbeitet (JSP ist Teil der Antwort). Es muss passieren * vor * Anfrage Verarbeitung und ein 'Filter 'ist der einzige richtige Ort, um die Arbeit zu machen. Für die Antwort ist es nur Duplizierung, da das 'pageEncoding =" UTF-8 "' genau das unter den Deckeln tut. Die Einstellung der Antwortheader sollte übrigens vorzugsweise auch in einem Filter erfolgen. Dadurch bleiben Ihre JSPs frei von Code-Duplikation. Siehe auch [Wie vermeidet man Java-Code in JSP?] (Http://stackoverflow.com/questions/3177733/how-to-avoid-java-code-in-jsp-files). – BalusC

Antwort

5

Sie müssen in web.xml Zeichencodierung Filter konfigurieren:

<filter> 
    <filter-name>charsetEncodingFilter</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>charsetEncodingFilter</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 

Servlet-Container behandelt POST-Request-Daten als ISO-8859-1, wenn Anfrage Codierung nicht specifed wird, während Browser das Formular in der Seitencodierung einreicht (UTF-8 in Ihrem Fall) und spezifiziert normalerweise nicht die Kodierung, deshalb benötigen Sie einen Filter, um die korrekte Anfragekodierung zu spezifizieren.

EDIT: Wie von BalusC korrekt erwähnt, behandelt es keine Codierungsprobleme mit GET-Anfragen. Um dies auf Tomcat zu beheben, müssen Sie URIEncoding="UTF-8" auf <Connector> in conf/server.xml setzen.

+2

Guter Rat für Spring-Benutzer, aber sollte darauf hingewiesen werden, dass dies nur POST-Anfragen, nicht GET-Anfragen behandelt. Es ist übrigens ein [einfaches Filter] (http://kickjava.com/src/org/springframework/web/filter/CharacterEncodingFilter.java.htm). Alles, was es im Grunde tut, ist 'request.setCharacterEncoding()', wenn 'request.getCharacterEncoding()' null zurückgibt. – BalusC

+0

Großartig !!! Vielen Dank, axtavt! Ich habe versucht, es zu lösen, indem ich Tomcat-Einstellungen konfiguriere, aber alles hilft mir nicht. – Ilnur

+1

Jede Einstellung, die Tomcat für die Anfragecodierung anbietet, betrifft GET-Anfragen, keine POST-Anfragen (das 'URIncoding' Attribut des HTTP' 'Elements). – BalusC