2013-04-16 6 views
8

Ich versuche, ein Formular, das UTF8-Zeichen enthält darin einzureichen. Das Formular sieht wie folgt aus:UTF-8-Codierung mit Formular Post und Spring Controller

<form id="workflowPersistForm" accept-charset="UTF-8" method="post" action="/workflow-next">> 
    <input id="stateGlobal" type="hidden" value=" お問い合わせ" name="state"> 
</form> 

Mein Server eine Feder basiert. Meine web.xml bereits die Encoding-Filter:

<filter> 
    <filter-name>EncodingFilter</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> 
    <init-param> 
     <param-name>forceEncoding</param-name> 
     <param-value>true</param-value> 
    </init-param> 
</filter> 

Das Problem ist, dass die UTF-8-Zeichen werden immer irgendwo vermasselt. Ich habe gerade am Anfang des Controllers einen Haltepunkt gesetzt, und die Charaktere sind an diesem Punkt selbst durcheinander. Wenn ich UTF8-Zeichen im Controller erzeuge, wird es im Browser korrekt gerendert. Nur beim Formularpost empfängt der Controller die Zeichen nicht richtig.

Irgendeine Idee, was ich falsch machen könnte?

Edit: Sieht so aus, auf der neuen Seite sind Daten nicht durcheinander, aber es ist doppelt codiert. Ich kann nicht verstehen, warum es doppelt kodiert ist.

Edit 2: Wenn ich das Formular anstelle von Post ändern, funktioniert alles perfekt. Ich habe keine Ahnung, was Post bricht.

Antwort

10

Sieht aus wie Browser in Request-Header nicht über die charset als Teil des Content-Type senden (auch wenn accept-charset auf Formular ist gesetzt) ​​und Tomcat beschäftigt sich mit Körper solcher Anforderungen als Latin-1 (http://wiki.apache.org/tomcat/FAQ/CharacterEncoding#Q1).

Dies könnte zu einem späteren Zeitpunkt als Latin-1 entschlüsselt und als UTF-8 codiert worden sein, was zu verzerrten Zeichen führt.

Das Verschieben von CharacterEncodingFilter nach oben und das Erzwingen der Codierung als UTF-8 wurde behoben.

+0

Viele verknüpfte Probleme, aber echtes Problem war mit Filter Reihenfolge in web.xml –

1

Ich würde vorschlagen, dass Sie den CharacterEncodingFilter entfernen, der selbst die Ursache der doppelten Codierung sein kann.

Um die Situation zu debuggen, sollten Sie zuerst überprüfen, ob der Browser die Daten korrekt veröffentlicht. Verwenden Sie Firebug (für Firefox) oder Entwickler-Tools auf Chrome (F12)

Höchstwahrscheinlich ist das Problem auf der Serverseite. Welchen Server benutzen Sie? Wenn Sie Tomcat verwenden, müssen Sie den CharsetEncoding auf UTF-8 auf dem Verbindungselement setzen in server.xml

Update 1:

Es ist sehr wahrscheinlich, sieht, dass das Problem das forceEncoding ist, dass Sie setzen . Gemäß den docs

Dieser Filter kann entweder seine Codierung anzuwenden, wenn der Antrag nicht bereits eine Codierung angeben, oder erzwingen diesen Filters Codierung in jedem Fall („forceEncoding“ = „true“)

Wenn Sie eine get, gibt es keine Codierung angegeben, so ist es sinnvoll, dass es funktioniert.

jedoch, wenn Sie die POST tun, wird die Codierung bereits angewendet und dann (wie es scheint) erneut angewendet, da der forceEncoding = true

+0

Ich überprüft Firebug alles sieht gut aus. Wenn ich nur eine Get-Anfrage anstelle von Post mache, funktioniert alles. – Bulbasaur

+0

siehe aktualisierte Antwort – arahant

+0

Nein, dieser Filter codiert tatsächlich nichts, er legt nur die Codierung der Anfrage als UTF8 fest. Was ist eigentlich das Richtige? – Bulbasaur

4

Haben Sie in Ihrem web.xml für EncodingFilter einen Filter-Mapping-Eintrag haben ?

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

Ja, das Mapping ist bereits vorhanden. – Bulbasaur

Verwandte Themen