Hans Würstchen: Ajax + Umlaute + ISO-8859-1 == Mist³

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.

  1. 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

    --
    RFC 1925, Satz 3: Mit ausreichendem Schub fliegen Schweine wunderbar. (...)
    1. 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.

      1. Unschön, weil "umgangen", nicht beseitigt.
      2. Serverlast, bei > 30K Bestellungen/Tag
      3. Ich bekomme zwar eine XML zurück, die sagt mir aber nur ob der UPDATE/INSERT-Vorgang erfolgreich war oder nicht, nichts was ich ins Dokument schreiben würde.
  2. 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

  3. hi,

    in welcher Codierung kommt die Benutzereingabe am Server an?

    Bitte prüf das mal.

    Hotte

    1. in welcher Codierung kommt die Benutzereingabe am Server an?

      UTF-8

      1. »» 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

        --
        Wenn der Kommentar nicht zum Code passt, kann auch der Code falsch sein.
        1. 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));

          1. 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

            1. 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.

          2. »» 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));

            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

            --
            Wenn der Kommentar nicht zum Code passt, kann auch der Code falsch sein.
            1. 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

  4. @@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'

    --
    Bildung lässt sich nicht downloaden. (Günther Jauch)
    1. 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

      --
      Wenn der Kommentar nicht zum Code passt, kann auch der Code falsch sein.
      1. @@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'

        --
        Bildung lässt sich nicht downloaden. (Günther Jauch)
    2. 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 ;)