O. Wyss: Javascript-Äuqivalent zu htmlentities (PHP)

Ich bekomme in einem Ajax-Request Zeichen wie "ü" zurück, muss die aber mit htmlentities codieren, da sonst die Übergabe abbricht. Wie wandle ich die codierten Zeichen wieder zurück in Javascript.

Oder gibt es eine gescheitere Methode, die Daten bei einem Ajax-Request zu codieren?

O. Wyss

  1. Da gibt es gleich mehrere... base64, uuencode,... allerdings glaube ich, dass es besser wäre, die Ursache des Problems zurückzuverfolgen, anstatt den Auslöser beseitigen zu wollen (denn was ist, wenn der Server mal nicht so antwortet, wie es von ihm erwartet wird?).

    Gruß, LX

    --
    X-Self-Code: sh:( fo:) ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
    X-Will-Answer-Email: Unusual
    X-Please-Search-Archive-First: Absolutely Yes
  2. Ich bekomme in einem Ajax-Request Zeichen wie "ü" zurück, muss die aber mit htmlentities codieren, da sonst die Übergabe abbricht. Wie wandle ich die codierten Zeichen wieder zurück in Javascript.

    Was heißt wieder zurück in JS? Ein ü ist ein problemloses Zeichen. Du hast vermutlich eher Probleme mit der Kodierung. AJAX ist erstmal immer in utf-8.

    Struppi.

  3. Hi,

    Ich bekomme in einem Ajax-Request Zeichen wie "ü" zurück, muss die aber mit htmlentities codieren, da sonst die Übergabe abbricht.

    Bist Du sicher, dass Ajax das abbricht? Das wäre mir neu. Verwendest Du eventuell json_encode(), die macht nämlich bei Iso-Latin-1-Umlauten Probleme.

    Gruesse, Joachim

    --
    Am Ende wird alles gut.
    1. Bist Du sicher, dass Ajax das abbricht? Das wäre mir neu. Verwendest Du eventuell json_encode(), die macht nämlich bei Iso-Latin-1-Umlauten Probleme.

      Ich verwende JSON.php,v 1.31 2006/06/28 von Michal Migurski. Gibt es besserer Json Lösungen, die keine Probleme mit Umlauten haben?

      O. Wyss

      1. Bist Du sicher, dass Ajax das abbricht? Das wäre mir neu. Verwendest Du eventuell json_encode(), die macht nämlich bei Iso-Latin-1-Umlauten Probleme.

        Ich verwende JSON.php,v 1.31 2006/06/28 von Michal Migurski. Gibt es besserer Json Lösungen, die keine Probleme mit Umlauten haben?

        Wie schon gesagt, das Problem sind nicht die Umlaute sondern die Kodierung über die du aber bisher nichts verraten hast.

        Struppi.

        1. Wie schon gesagt, das Problem sind nicht die Umlaute sondern die Kodierung über die du aber bisher nichts verraten hast.

          Meinst du mit der Kodierung den Zeichensatz der Webseite (charset=iso-8859-1) oder den Colating der DB (Iso-Latin-1)? Was sollte ich für Deutsch/Französisch/Italienisch deiner Ansicht nach verwenden?

          O. Wyss

          1. Wie schon gesagt, das Problem sind nicht die Umlaute sondern die Kodierung über die du aber bisher nichts verraten hast.

            Meinst du mit der Kodierung den Zeichensatz der Webseite (charset=iso-8859-1) oder den Colating der DB (Iso-Latin-1)? Was sollte ich für Deutsch/Französisch/Italienisch deiner Ansicht nach verwenden?

            Wie schon gesagt, AJAX ist utf-8, wenn deine Webseite in iso ist, dann ist das das Problem. Das einfachste in dem Fall ist die Umstellung der Seite auf utf-8.

            Du kannst aber auch versuchen die Übertragung der Daten auf iso umstellen, dazu muss dein Serverskript aber einen entsprechenden Header senden.

            Struppi.

            1. Wie schon gesagt, AJAX ist utf-8, wenn deine Webseite in iso ist, dann ist das das Problem. Das einfachste in dem Fall ist die Umstellung der Seite auf utf-8.

              Ich bin ziemlich sicher, dass das nicht das Problem löst, sondern dass es am json.php liegt. Nur wie flicke ich das?

              O. Wyss

              1. Wie schon gesagt, AJAX ist utf-8, wenn deine Webseite in iso ist, dann ist das das Problem. Das einfachste in dem Fall ist die Umstellung der Seite auf utf-8.

                Ich bin ziemlich sicher, dass das nicht das Problem löst, sondern dass es am json.php liegt. Nur wie flicke ich das?

                Ich bin mir ziemlich sicher das du damit falsch liegst. Um genau zu sein, ich weiß dass das falsch ist.

                Struppi.

                1. Ich bin mir ziemlich sicher das du damit falsch liegst. Um genau zu sein, ich weiß dass das falsch ist.

                  Na gut, und wie löse ich nun das Problem?

                  O. Wyss

                  1. Ich bin mir ziemlich sicher das du damit falsch liegst. Um genau zu sein, ich weiß dass das falsch ist.

                    Na gut, und wie löse ich nun das Problem?

                    In dem du die Seite in utf-8 darstellst.

                    Struppi.

                    1. @@Struppi:

                      In dem du die Seite in utf-8 darstellst.

                      Wie ändert man die Zeichencodierung seiner (X)HTML-Seiten auf UTF-8?

                      Live long and prosper,
                      Gunnar

                      --
                      Erwebsregel 208: Manchmal ist das einzige, was gefährlicher als eine Frage ist, eine Antwort.
                    2. In dem du die Seite in utf-8 darstellst.

                      Ich kann doch in einem Nicht-UTF-8-kodierten Dokument Daten wie XMLHttpRequest laden, die UTF-8-kodiert sind. JavaScript kennt ja eh keine Kodierung mehr, responseText ist das, was bei der Dekodierung herauskommt.
                      Also reicht es doch, wenn der Server korrekt UTF-8-kodierte Daten sendet, oder? Und wenn die Seite UTF-8 hat, aber der Server nicht UTF-8-kodierte Daten als Antwort auf XMLHttpRequest sendet, ist mir auch nicht geholfen.

                      Mathias

                      1. In dem du die Seite in utf-8 darstellst.

                        Ich kann doch in einem Nicht-UTF-8-kodierten Dokument Daten wie XMLHttpRequest laden, die UTF-8-kodiert sind. JavaScript kennt ja eh keine Kodierung mehr, responseText ist das, was bei der Dekodierung herauskommt.

                        verstehe ich jetzt nicht so ganz, in dem Fall bekommst du ein Fragezeichen angezeigt, oder nicht?

                        Also reicht es doch, wenn der Server korrekt UTF-8-kodierte Daten sendet, oder? Und wenn die Seite UTF-8 hat, aber der Server nicht UTF-8-kodierte Daten als Antwort auf XMLHttpRequest sendet, ist mir auch nicht geholfen.

                        Wurde diese Information schon genannt? soweit ich das sehe läuft etwas schief bei der Umwandlung der utf-8 kodierten Daten in einer iso kodierten Seite. Ob das Problem an der kodierung liegt ist meine Vermutung, aber vielleicht ist sie ja auch falsch.

                        Struppi.

      2. Ich verwende JSON.php,v 1.31 2006/06/28 von Michal Migurski. Gibt es besserer Json Lösungen, die keine Probleme mit Umlauten haben?

        Es gibt keine Scripte, die »Probleme mit Umlauten haben« und es gibt keine Scripte, die »keine Probleme mit Umlauten haben«.

        Es gibt lediglich Scripte, die gewisse Zeichenkodierungen annehmen, verarbeiten und ausgeben.

        JSON.php nimmt UTF-8-kodierte Strings an. Wenn du also einen String oder z.B. einen Array mit Strings an $json->encode() übergibst, dann muss dieser String UTF-8-kodiert sein.

        Stelle sicher, dass das der Fall ist. Dazu musst du dich fragen, woher die Daten kommen, welche Kodierung sie haben und ggf. musst du sie umkodieren. ISO-8859-1 zu UTF-8 lässt sich z.B. mit utf8_encode() rekodieren.

        Mathias

        1. Stelle sicher, dass das der Fall ist. Dazu musst du dich fragen, woher die Daten kommen, welche Kodierung sie haben und ggf. musst du sie umkodieren. ISO-8859-1 zu UTF-8 lässt sich z.B. mit utf8_encode() rekodieren.

          Soweit bin ich auch schon gekommen. Jetzt kommt natürlich die obligate Frage, wie macht man den utf8_encode in Javascript wieder rückgängig?

          O. Wyss

          1. Soweit bin ich auch schon gekommen. Jetzt kommt natürlich die obligate Frage, wie macht man den utf8_encode in Javascript wieder rückgängig?

            Du kennst google?
            Das ist aber dann eher eine Krücke für eine zumindest zweifelhafte implementierung.

            Struppi.

            1. Das ist aber dann eher eine Krücke für eine zumindest zweifelhafte implementierung.

              Ich habe jetzt festgestellt, dass auch in einer "iso-8859-1"-Seite ein "ü" in "utf8" richtig dargestellt wird. Zumindest machen es SeaMonkey und IE richtig. Damit erübrigt sich eine Zurückwandlung.

              Das Hauptproblem ist aber die Json-Implementierung, sie macht nämlich eine implizite Unicode-zu-Utf8-Konvertierung. Dies ist aber nirgendwo im PHP-Manuel erklärt, womit die Probleme überhaupt entstehen. Eigentlich sollte gar keine Wandlung gemacht werden, oder dann höchstens über einen zusätzlichen Zeichensatz-Parameter.

              O. Wyss

              1. echo $begrüßung;

                Das Hauptproblem ist aber die Json-Implementierung, sie macht nämlich eine implizite Unicode-zu-Utf8-Konvertierung.

                Sowas geht nicht. Unicode ist ein Zeichensatz. Das ist eine Zuordnung von Zeichen zu Codepoints und nur ein theoretisches Gebilde. Unicode legt nicht fest, wie so ein Codepoint in einem Computer (z.B. in Bytes) zu kodieren ist. Dafür sind Kodierungen wie UTF-8 oder andere interne Formate von irgendwelchen Systemen zuständig. Um ein Unicode-Zeichen zu speichern ist also immer eine Kodierung erforderlich. Von der kann man, wenn sich die Notwendigkeit ergibt, in eine andere Kodierung umkodieren.

                Dies ist aber nirgendwo im PHP-Manuel erklärt, womit die Probleme überhaupt entstehen. Eigentlich sollte gar keine Wandlung gemacht werden, oder dann höchstens über einen zusätzlichen Zeichensatz-Parameter.

                Da das nicht passiert, kann das auch nicht im Handbuch stehen. Zu json_encode() steht allerdings zu dessen einzigem Parameter value: This function only works with UTF-8 encoded data.

                echo "$verabschiedung $name";

                1. Das Hauptproblem ist aber die Json-Implementierung, sie macht nämlich eine implizite Unicode-zu-Utf8-Konvertierung.

                  Sowas geht nicht.

                  Ich weiss zwar nicht genau, was die Json-Implementierung in PHP macht, ich vermute dasselbe wie "JSON.php,v 1.31 2006/06/28 von Michal Migurski", weil sie gleich reagiert. Dafür weiss ich recht gut, was das JSON.php macht und das macht eine implizite Konvertierung. Genau deshalb bricht es bei einem ISO-8859-1 "ü" ab.

                  O. Wyss

                  1. Dafür weiss ich recht gut, was das JSON.php macht und das macht eine implizite Konvertierung. Genau deshalb bricht es bei einem ISO-8859-1 "ü" ab.

                    Sie erwartet UTF-8, das sagte ich doch. Es findet keine Konvertierung statt, sondern eine Dekodierung und Umwandlung von Zeichen, die mit mehreren Bytes kodiert sind, in Unicode-Escape-Sequenzen. Dazu wird aber wie gesagt UTF-8 erwartet. Wenn ich ein ISO-8859-1-kodiertes ü eingebe, kommen beknackte Escape-Sequenzen wie \u002000570065006c0074 heraus.

                    Mathias

                  2. echo $begrüßung;

                    Das Hauptproblem ist aber die Json-Implementierung, sie macht nämlich eine implizite Unicode-zu-Utf8-Konvertierung.
                    Sowas geht nicht.
                    Ich weiss zwar nicht genau, was die Json-Implementierung in PHP macht, ich vermute dasselbe wie "JSON.php,v 1.31 2006/06/28 von Michal Migurski", weil sie gleich reagiert. Dafür weiss ich recht gut, was das JSON.php macht und das macht eine implizite Konvertierung. Genau deshalb bricht es bei einem ISO-8859-1 "ü" ab.

                    Wenn es abbricht, macht es keine Konvertierung, sonst müsste es ja nicht abbrechen. Ein ISO-8859-1-ü ist kein gültiger UTF-8-Code, weswegen es an der Stelle ungewollt reagieren darf.

                    Auch die von dir erwähnte JSON-Implementation (wenn ich die richtige gefunden habe, eine eindeutige URL gabst du ja nicht an) erwartet UTF-8-kodierte Daten (oder ASCII, was eine kleine Untermenge von UTF-8 ist): if var is a string, note that encode() always expects it to be in ASCII or UTF-8 format! Die Konvertierung, die im Quelltext zu sehen ist, kodiert UTF-8-kodierte Zeichen jenseits von ASCII in eine Javascript-Darstellung \uxxxx (plus einer Sonderbehandlung für einige andere spezielle Zeichen).

                    Die in PHP enthaltene JSON-Implementierung verhält sich in dem Punkt gleich. Sie erwartet UTF-8 und konvertiert die Nicht-ASCII-UTF-8-Zeichen in die Javascript-Notation \uxxxx. Bei beiden führt also kein Weg dran vorbei, die Zeichen als UTF-8 zu übergeben. Wenn sie dir nicht in der Kodierung vorliegen, musst du sie selbst umkodieren.

                    echo "$verabschiedung $name";

          2. wie macht man den utf8_encode in Javascript wieder rückgängig?

            Textkodierungen muss man nicht rückgängig machen, das geschieht i.d.R. automatisch beim Dekodieren. Wenn JavaScript per XMLHttpRequest Daten vom Server bezieht, dann hat es - UTF-8-Kodierung und entsprechende Kodierungsangaben vorausgesetzt - direkt Zugriff auf die rohen Zeichendaten. Eine weitere Dekodierung ist nicht notwendig, wenn man die Daten korrekt überträgt. Ein String in JavaScript hat keine Kodierung, sondern ist immer ein String aus Unicode-Zeichen.

            Schematisch:
            Zeichen in der serverseitigen Anwendung -> kodiertes Zeichen -> Übertragung der Bytes -> Dekodierung -> Zeichen in der clientseitigen Anwendung

            (Wobei das bei PHP nicht ganz stimmt, weil Strings in PHP immer schon kodiert sind, d.h. sie sind bloß aneinandergereihte Bytes. Eine Abstraktion von »String aus Bytes« zu »String aus Zeichen« gibt nicht nativ in PHP, höchstens emuliert mithilfe der mbstring-Erweiterung.)

            Mathias