Ajax + Umlaute + ISO-8859-1 == Mist³
Hans Würstchen
- programmiertechnik
0 LX0 molily0 hotti0 Hans Würstchen0 hotti0 Hans Würstchen
0 Gunnar Bittersmann
Hallo zusammen,
es geht um die Sonderzeichen/Umlaute bei Ajax-Requests.
Szenario:
Eine Kundenadresse wird gändert, die neue Adresse wird per Ajax an eine PERL (Soap) übermittelt, diese schickt dir Daten weiter zu Webservice, wo sie endgültig in die DB gespeichert werden.
// Hier ein kleiner Ausschnitt
function sendRequest(AKTION, URL, PARAMS) {
http_request = false;
if(window.XMLHttpRequest) { // Mozilla, Safari
http_request = new XMLHttpRequest();
if(http_request.overrideMimeType) {
// http_request.overrideMimeType('text/xml');
}
}
else if(window.ActiveXObject) { // IE
try {
http_request = new ActiveXObject("Msxml2.XMLHTTP");
}
catch(e) {
try {
http_request = new ActiveXObject("Microsoft.XMLHTTP");
}
catch (e) {}
}
}
if(!http_request) { alert("Fehler!") return false; }
http_request.onreadystatechange = function() { readResponse(AKTION, PARAMS); }
http_request.open("POST", URL, true);
http_request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
if(PARAMS) http_request.send(PARAMS);
else http_request.send(null);
}
Problem:
Das ganze Projekt (eShop) läuft in ISO-8859-1 Encoding, das Ajax aber in UTF-8, was sich ja auch leider nicht umstellen lässt.
Das Resultat ist *scheiße*, Umlaute zerschoßen und die Kundenadresse somit unbrauchbar.
Lösung:
Das Dokument auf UTF-8 umstellen kommt nicht in Frage, da schon bald die Testphase beginnt und es zeitlich einfach nicht mehr machbar ist.
Ajax (setRequestHeader) auf ISO umstellen bringt nix.
Alle Eingabedaten escapen (HTML) und dann wieder unescapen (PERL) ist meiner Meinung nach ein ziemlich schlecher Programmierstil, daher wäre das die aller letzte Lösung.
Was kann ich tun? Bin am verzweifeln.
Warum nicht bei der Perl-Ausgabe der XML-Schnipsel die Zeichen sauber als (hexa-)dezimale XML-Entities escapen? Der Vorteil liegt auf der Hand: das Encoding-Problem wird umgangen und Du brauchst nur eine Umwandlung.
Gruß, LX
Warum nicht bei der Perl-Ausgabe der XML-Schnipsel die Zeichen sauber als (hexa-)dezimale XML-Entities escapen? Der Vorteil liegt auf der Hand: das Encoding-Problem wird umgangen und Du brauchst nur eine Umwandlung.
Was kann ich tun?
Du lässt das Perlscript die Eingabedaten von UTF-8 in ISO-8859-1 umkodieren.
Ich kann kein Perl, aber vermutlich geht das mit Encode::from_to.
Mathias
hi,
in welcher Codierung kommt die Benutzereingabe am Server an?
Bitte prüf das mal.
Hotte
in welcher Codierung kommt die Benutzereingabe am Server an?
UTF-8
»» in welcher Codierung kommt die Benutzereingabe am Server an?
UTF-8
OK; dann sollte es auch kein Problem sein, diese Zeichen zu speichern oder in einem Browser darzustellen.
Hotte
OK; dann sollte es auch kein Problem sein, diese Zeichen zu speichern oder in einem Browser darzustellen.
Das ganze Projekt läuft in ISO, nur der Ajax-Request läuft in UTF-8, daher diese Probleme, inzwischen habe ich es behoben, mit http_request.send(encodeURI(PARAMS));
inzwischen habe ich es behoben, mit
http_request.send(encodeURI(PARAMS));
Dir ist klar, was encodeURI macht?
Es URL-kodiert Zeichen außerhalb GEMÄSS UTF-8 (Z.B. encodeURI("ä") > %C3%A4)
Der Bytestream, der dann beim Server ankommt, ist UTF-8 kodiert. (Z.B. ä wird mit den Bytes 0xC3 0xA4 übertragen).
Ich dachte, genau das willst du NICHT?!
Mathias
Dir ist klar, was encodeURI macht?
Ja.
Ich dachte, genau das willst du NICHT?!
Ja wollte ich auch nicht, weil diese Lösung das Problem umgeht, nicht löst, aber unser Zeit wird knapp, daher besser diese Lösung, als gar keine.
»» OK; dann sollte es auch kein Problem sein, diese Zeichen zu speichern oder in einem Browser darzustellen.
Das ganze Projekt läuft in ISO, nur der Ajax-Request läuft in UTF-8, daher diese Probleme, inzwischen habe ich es behoben, mithttp_request.send(encodeURI(PARAMS));
Womit mir jetzt klar ist, dass Deine Aussage von vorhin
die Benutzereingabe kommt am Server UTF-8 kodiert an<
nicht richtig war. Wenn ich Dich schonmal darum bitte, genau das zu prüfen, dann tu es auch bitte. Ansonsten wird eine Zusammenarbeit schwierig.
Hotte
Womit mir jetzt klar ist, dass Deine Aussage von vorhin
die Benutzereingabe kommt am Server UTF-8 kodiert an<
nicht richtig war.
Wieso ist dir das klar?
Wenn ich mich recht entsinne, werden auch ohne explizites encodeURI(Component) Nicht-ASCII-Zeichen im POST-Body beim Senden über XMLHttpRequest automatisch UTF-8-kodiert. Darin besteht der ganze UTF-8-Zwang.
Den kann man zwar umgehen, indem man mit escape() arbeitet, nur hat man dann für Nicht-Latin1-Zeichen unbrauchbare und uneindeutige Maskierungen wie »\uXXXX«.
Mathias
@@Hans Würstchen:
nuqneH
- Das Dokument auf UTF-8 umstellen kommt nicht in Frage, da schon bald die Testphase beginnt und es zeitlich einfach nicht mehr machbar ist.
Das sollte allen für zukünftige Projekte eine Lehre sein, niemals eine andere Zeichencodierung als UTF-8 zu verwenden.
Qapla'
hi Gunnar,
Das sollte allen für zukünftige Projekte eine Lehre sein, niemals eine andere Zeichencodierung als UTF-8 zu verwenden.
Deine Artikel-Übersetzungen zum Thema Zeichenkodierung auf w3.org lese ich immer wieder gerne!
Danke und viele Grüße,
Horst Hselhuhn
@@hotti:
nuqneH
Deine Artikel-Übersetzungen zum Thema Zeichenkodierung auf w3.org lese ich immer wieder gerne!
Welcome.
Damit du nicht immer wieder dieselben lesen musst: noch eine.
Qapla'
Das sollte allen für zukünftige Projekte eine Lehre sein, niemals eine andere Zeichencodierung als UTF-8 zu verwenden.
Oh ja, das kannst du mir aber glauben ;)