Peter: htmlentities und das € Zeichen

Ich nutze für eine Shoutbox htmlentities um alle gefährlichen html-Zeichen aus dem Text zu verbannen. Dies funktionierte bis vor kurzem sehr gut, als ein Nutzer ein €-Zeichen eingeben wollte. Dies wurde als € dargestellt.
Im Quelltext hab ich festgestellt, dass htmlentities aus dem € Zeichen &#8364 macht. Da nun das & umgewandelt wurde, wird das Euro Zeichen nicht mehr korrekt dargestellt. Ich habe verschiedene Zeichensatz Angaben in htmlentities ausprobiert, jedoch besteht mein Problem weiterhin. Hat jemand eine Lösung dafür ??

Danke für eure Bemühungen.

  1. Hallo Peter.

    Ich nutze für eine Shoutbox htmlentities um alle gefährlichen html-Zeichen aus dem Text zu verbannen. Dies funktionierte bis vor kurzem sehr gut, als ein Nutzer ein €-Zeichen eingeben wollte. Dies wurde als € dargestellt.
    Im Quelltext hab ich festgestellt, dass htmlentities aus dem € Zeichen &#8364 macht.

    Das klingt, als wurde über die Ausgabe von htmlentities noch einmal htmlspecialchars gejagt. Ist das der Fall?

    Einen schönen Dienstag noch.

    Gruß, Ashura

    --
    sh:( fo:} ch:? rl:( br: n4:~ ie:{ mo:| va:) de:> zu:} fl:( ss:) ls:[ js:|
    „It is required that HTML be a common language between all platforms. This implies no device-specific markup, or anything which requires control over fonts or colors, for example. This is in keeping with the SGML ideal.“
    [HTML Design Constraints: Logical Markup]
    1. Nee, habe ich nicht verwendet, oder gibt es eine andere Funktion, die einen ähnlichen Effekt hätte, wie htmlspecialchars.
      Die verwendete Funktion war: $text=htmlentities($text,ENT_COMPAT,"ISO8859-15");

      wenn ich die Funktion aus dem Quelltext streiche funktioniert es wunderbar.

      1. Hallo Peter.

        Nee, habe ich nicht verwendet, oder gibt es eine andere Funktion, die einen ähnlichen Effekt hätte, wie htmlspecialchars.
        Die verwendete Funktion war: $text=htmlentities($text,ENT_COMPAT,"ISO8859-15");

        wenn ich die Funktion aus dem Quelltext streiche funktioniert es wunderbar.

        Damit allein kann ich dein Problem nicht nachvollziehen:

        $ php5 -r '$text="Drei € fünzig.\n";$text=htmlentities($text,ENT_COMPAT, "UTF-8");echo $text;'

        → Ausgabe: Drei € fünzig.

        Da _muss_ noch irgendwo etwas dazwischenfunken.

        Deine Aufgabe besteht nun darin, dir einmal an sämtlichen mehr oder weniger markanten Stellen in deinem Script den Inhalt der Variable auszugeben, welche den später auszugebenden Text enthält. Vergleiche hierbei immer die Ausgabe mit dem, was du erwartest, was die Ausgabe sein sollte. Hierdurch solltest du den Übeltäter aufspüren können.

        Einen schönen Dienstag noch.

        Gruß, Ashura

        --
        sh:( fo:} ch:? rl:( br: n4:~ ie:{ mo:| va:) de:> zu:} fl:( ss:) ls:[ js:|
        „It is required that HTML be a common language between all platforms. This implies no device-specific markup, or anything which requires control over fonts or colors, for example. This is in keeping with the SGML ideal.“
        [HTML Design Constraints: Logical Markup]
  2. Moin!

    Ich nutze für eine Shoutbox htmlentities um alle gefährlichen html-Zeichen aus dem Text zu verbannen.

    htmlspecialchars() wäre die richtige Lösung, dort werden alle "HTML-aktiven" Zeichen als Entity codiert (<, >, &).

    htmlentities() codiert (unnötig) noch viel mehr Zeichen.

    Dies funktionierte bis vor kurzem sehr gut, als ein Nutzer ein €-Zeichen eingeben wollte. Dies wurde als &#8364; dargestellt.
    Im Quelltext hab ich festgestellt, dass htmlentities aus dem € Zeichen &amp;#8364 macht. Da nun das & umgewandelt wurde, wird das Euro Zeichen nicht mehr korrekt dargestellt. Ich habe verschiedene Zeichensatz Angaben in htmlentities ausprobiert, jedoch besteht mein Problem weiterhin. Hat jemand eine Lösung dafür ??

    Dein Problem liegt nicht in der Verwendung von htmlentities() (oder besser htmlspecialchars()), sondern im Zeichensatz seiner Seite.

    Ich gehe jede Wette ein, du verwendest ISO-8859-1. Damit ist die Darstellung des Eurozeichens nicht möglich - es ist dort schlicht nicht definiert.

    Das bedeutet: Dein Shoutbox-Formular erlaubt zwar die Tasteneingabe für das Eurozeichen - der Browser kann es aber in ISO-8859-1 nicht verschicken.

    Manche Browser ersetzen uncodierbare Zeichen durch Fragezeichen. Andere Browser ersetzen uncodierbare Zeichen durch die numerische Zeichenreferenz (beim Eurozeichen eben "&#8364;") im Text. Noch andere Browser ändern den Zeichensatz so, dass das Eurozeichen doch codierbar ist (z.B. Windows-1252). Keiner dieser Mechanismen versetzt dich in die Lage, an die nicht codierbaren Zeichen zu gelangen.

    Es gibt keine andere Möglichkeit, als dein Formular, und damit deine gesamte Seite, in einem Zeichensatz zu codieren, der die Darstellung sämtlicher eingebbaren Zeichen erlaubt, und das ist UTF-8 (sowie jede andere Codierung, die den gesamten Unicode-Zeichenbereich darstellen kann, wie z.B. auch UTF-16 etc., was aber für westeuropäische Seiten unnötig mehr Datenmenge bedeutet).

    - Sven Rautenberg

    --
    "Love your nation - respect the others."
    1. Danke für den Hinweis.
      Habe nun gesendet header("Content-Type: text/html;charset=utf-8");
      und nochmal in html charset auf utf-8 gesetzt.
      Nun noch die htmlentities angepasst. $text=htmlentities($text,ENT_COMPAT,"UTF-8");

      ung gut is ;-)

      Danke für die prompte Hilfe.

      1. Moin!

        Habe nun gesendet header("Content-Type: text/html;charset=utf-8");
        und nochmal in html charset auf utf-8 gesetzt.
        Nun noch die htmlentities angepasst. $text=htmlentities($text,ENT_COMPAT,"UTF-8");

        Wie gesagt: Du brauchst keine Entities z.B. für die Umlaute. Du brauchst nur die Wandlung der HTML-aktiven Zeichen. Und das leistet htmlspecialchars() vollkommen unabhängig vom üblichen Zeichensatz.

        ung gut is ;-)

        Glaube ich nicht unbedingt, es sei denn, du hast deine gespeicherten Seiten direkt mit konvertiert.

        - Sven Rautenberg

        --
        "Love your nation - respect the others."
    2. Moin Sven.

      Manche Browser ersetzen uncodierbare Zeichen durch Fragezeichen. Andere Browser ersetzen uncodierbare Zeichen durch die numerische Zeichenreferenz (beim Eurozeichen eben "&#8364;") im Text.

      Letzteres ist mir bisher noch nie untergekommen. Welcher Browser macht dies zum Beispiel?

      Einen schönen Dienstag noch.

      Gruß, Ashura

      --
      sh:( fo:} ch:? rl:( br: n4:~ ie:{ mo:| va:) de:> zu:} fl:( ss:) ls:[ js:|
      „It is required that HTML be a common language between all platforms. This implies no device-specific markup, or anything which requires control over fonts or colors, for example. This is in keeping with the SGML ideal.“
      [HTML Design Constraints: Logical Markup]
      1. Moin!

        Manche Browser ersetzen uncodierbare Zeichen durch Fragezeichen. Andere Browser ersetzen uncodierbare Zeichen durch die numerische Zeichenreferenz (beim Eurozeichen eben "&#8364;") im Text.

        Letzteres ist mir bisher noch nie untergekommen. Welcher Browser macht dies zum Beispiel?

        Mozilla.

        Und das Problem ist: Man kann hinterher nicht mehr feststellen, was der Benutzer eingegeben hat.

        Teststring Eingabe:
        "Das Euro-Zeichen € ist als Entity &#8364;."

        Gesendet ans Skript durch Firefox bei ISO-8859-1:
        "Das Euro-Zeichen &#8354; ist als Entity &#8364;."

        Gesendet ans Skript mit Fragezeichen:
        "Das Euro-Zeichen ? ist als Entity &#8364;."

        Wohlgemerkt: Das sind Texte, die erstmal als text/plain eines Textarea-Ergebnisses betrachtet werden - die wieder in HTML zu verpacken ist nochmal ein Schritt weiter.

        Siehe https://bugzilla.mozilla.org/show_bug.cgi?id=228779

        - Sven Rautenberg

        --
        "Love your nation - respect the others."
        1. Hallo Sven.

          Manche Browser ersetzen uncodierbare Zeichen durch Fragezeichen. Andere Browser ersetzen uncodierbare Zeichen durch die numerische Zeichenreferenz (beim Eurozeichen eben "&#8364;") im Text.

          Letzteres ist mir bisher noch nie untergekommen. Welcher Browser macht dies zum Beispiel?

          Mozilla. […]

          Aha, war mir allerdings neu, danke. Glücklicherweise muss ich mir darüber dank UTF–8 keine Gedanken machen.

          Einen schönen Dienstag noch.

          Gruß, Ashura

          --
          sh:( fo:} ch:? rl:( br: n4:~ ie:{ mo:| va:) de:> zu:} fl:( ss:) ls:[ js:|
          „It is required that HTML be a common language between all platforms. This implies no device-specific markup, or anything which requires control over fonts or colors, for example. This is in keeping with the SGML ideal.“
          [HTML Design Constraints: Logical Markup]