Problemstellung: Die Daten eines Formulares, welches in eine ISO-8859-1 enkodierte Seite eingebettet ist, soll UTF-8 kodiert an eine (andere) URL gesendet werden.
Browser submitten in der Regel ihre Formulardaten stets in dem Encoding, in welchem die Seite gerendert wurde [
quelle]. Mit dem Attribut
accept-charset sollte man eigentlich das Encoding explizit angeben können, aber leider wird es vom IE nicht korrekt unterstützt. Der IE sendet nämlich das Formular nur dann in UTF-8, falls auch ein Sonderzeichen im Formular mit eingegeben wurde. Server-seitig kann man sich also nicht sicher sein, in welcher Kodierung die Daten übermittelt wurden.
Die IE-Entwickler haben aber seit dem IE 5 nun folgenden Workaround implementiert: Falls das Formular ein hidden-input-Feld namens _charset_ enthält, so wird dieses mit dem verwendeten Enkoding ausgefüllt an den Server mitgesendet.
<form action=".." method="POST" accept-charset="UTF-8">
<input type="hidden" name="_charset_" value="" />
..
</form>
Nun muss man server-seitig dieses Hidden-Field abfragen, und entsprechend auf die mitgesandten Daten anwenden.
Das genaue IE-Verhalten lässt sich hier nachlesen:
https://bugzilla.mozilla.org/show_bug.cgi?id=18643#c12
Der IE ist also noch immer für Überraschungen gut. Seufz.
Nachtrag: Die Servlet API stellt die Methode ServletRequest.setCharacterEncoding(String) zur Verfügung. Da man diese Methode aber aufrufen muss,
bevor man den Request parsed, nützt einem das _charset_-Feld rein gar nichts, da man ja dieses auch nur aus den Request-Parametern auslesen kann.
Nachtrag 2: Wow, magic at work! Mein Beitrag
erscheint automatisch unterhalb Sam Ruby's Artikel als Kommentar. Anscheinend nur durch den Referrer (oder Technorati?).
Nachtrag 3 (und die "
Lösung" für die Problemstellung): Wie oben angemerkt wurde, sendet der IE nur in UTF-8 wenn ein entsprechendes Zeichen eingegeben wurde. Bzw wenn man client-seitig ein solches Zeichen einem Form-Feld einfügt. Auf diese Weise lässt sich der IE also doch noch dazu überreden, stets UTF-8 zu senden. Verrückt.
<form action=".." method="POST" accept-charset="UTF-8">
<input type="hidden" name="dummyChar" value="♥" />
..
</form>
michi - 22.Apr 2007 19:06 -
technisches