Cheatah: htmlentities() verwendet nicht get_html_translation_table()

Hi,

folgende Situation:

  • Ein XML (<?xml version="1.0" encoding="UTF-8"?>) enthält <description>... "You&#x2019; re Beautiful" ...</description>.

  • Dieses lese ich wie folgt aus:
      $xml = simplexml_load_string(...);
      $foo = $item->xpath('//description/text()')[0]; // Code leicht verkürzt

  • Es enthält nunmehr den Text '... "You’ re Beautiful" ...', was (soweit ich es überblicke) korrekt UTF-8-dekodiert ist.

  • Dies gebe ich aus mit:
      print htmlentities($foo, null, 'UTF-8');

  • Ergebnis: '... "You&rsquo; re Beautiful" ...'.

So weit, so gut. Da ich aber wieder XML ausgeben muss, ersetze ich alle HTML-Entities durch ihre nummerischen Gegenstücke, indem ich get_html_translation_table(HTML_ENTITIES) umkehre und in str_replace() jage. Nach meinem Dafürhalten sollte dies idiotensicher sein, da laut Doku eben dies von htmlentities() verwendet wird.

Lasse ich mir var_dump(get_html_translation_table(HTML_ENTITIES)) ausgeben, sehe ich aber nirgendwo "&rsquo;", so dass dies auch nicht in meiner Funktion rückübersetzt wird. Dieses Problem konnte ich zwar mit dem zweiten User-Kommentar lösen; aber es bleibt ein ungutes Gefühl: Wenn htmlentities() plötzlich Entities aus der hohlen Hand zaubert, mit welchen muss ich dann rechnen?

Daher meine Fragen: Habe ich irgendwo einen Denk- oder sonstigen Fehler? Zeigt sich mal wieder mein mangelhaftes Wissen um die Zeichensätze? Kann ich codemäßig das Problem beheben, ohne Massen von Entities angeben zu müssen?

Cheatah

--
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: No
X-Please-Search-Archive-First: Absolutely Yes
  1. echo $begrüßung;

    Wenn htmlentities() plötzlich Entities aus der hohlen Hand zaubert, mit welchen muss ich dann rechnen?

    Im Gegensatz zu get_html_translation_table() kann man htmlentities() und htmlspecialchars() einen charset-Parameter mitgeben. Der beeinflusst das Ergebnis der beiden letzten Funktionen. Für die erste wird generell ISO-8859-1 angenommen.[1]

    Kann ich codemäßig das Problem beheben, ohne Massen von Entities angeben zu müssen?

    Ich nehme an, komplett auf UTF-8 zu bauen, ist keine Option für dich?

    [1] Meine Informationsquelle: http://cvs.php.net/viewvc.cgi/php-src/ext/standard/html.c?view=markup

    echo "$verabschiedung $name";

    1. Hi,

      Im Gegensatz zu get_html_translation_table() kann man htmlentities() und htmlspecialchars() einen charset-Parameter mitgeben. Der beeinflusst das Ergebnis der beiden letzten Funktionen.

      ja, aber doch nicht in der Menge der bekannten Entities? Diese sollten doch in get_html_translation_table() vollständig hinterlegt sein, soweit ich die Sachlage verstehe. Die Verwendung von htmlentities() produziert jedoch Entities, die ich in get_html_translation_table() nicht finde.

      Ich nehme an, komplett auf UTF-8 zu bauen, ist keine Option für dich?

      Das würde ich gerne tun, nur weiß ich nicht wie. Bei htmlentities() gebe ich UTF-8 bereits an - was kann ich noch tun?

      [1] Meine Informationsquelle: http://cvs.php.net/viewvc.cgi/php-src/ext/standard/html.c?view=markup

      Leider bin ich in C und C++ sowas von unbewandert, dass ich nicht mal ermitteln kann, welche der beiden Sprachen zutrifft ;-) Aber soweit ich den Code zu lesen vermag, scheint UTF-8 hier weitgehend mit ISO-8859-1 identisch zu sein; die Stein-des-Anstoßes-Entity &quot; kommt hingegen nur bei CP-1252 vor. Leider bin ich somit verwirrter als zuvor ...

      ... dennoch vielen Dank für Deine Antwort :-)

      Cheatah

      --
      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: No
      X-Please-Search-Archive-First: Absolutely Yes
      1. Moin!

        Ich nehme an, komplett auf UTF-8 zu bauen, ist keine Option für dich?

        Das würde ich gerne tun, nur weiß ich nicht wie. Bei htmlentities() gebe ich UTF-8 bereits an - was kann ich noch tun?

        Weniger.

        UTF-8 zwingt dich ja nicht, numerische Zeichenreferenzen einzubauen. Das ist ja doch gerade der Witz an der Sache, dass man wirklich alle Unicode-Zeichen direkt als Bytekombination im String stehen hat.

        Dein XML-Parser wandelt numerische Zeichenreferenzen in UTF-8-Zeichen um. Und gut ist. Diese Zeichen bzw. ihre Bytes kannst du direkt so lassen.

        Auch bei der erneuten Ausgabe als XHTML, XML oder HTML - oder sonstwas. Solange du angibst, dass du UTF-8 codierst, sollte die Gegenseite damit kein Problem haben. Sie hätte es ansonsten auch mit den numerischen Zeichenreferenzen.

        - Sven Rautenberg

        --
        "Love your nation - respect the others."
      2. echo $begrüßung;

        Im Gegensatz zu get_html_translation_table() kann man htmlentities() und htmlspecialchars() einen charset-Parameter mitgeben. Der beeinflusst das Ergebnis der beiden letzten Funktionen.
        ja, aber doch nicht in der Menge der bekannten Entities? Diese sollten doch in get_html_translation_table() vollständig hinterlegt sein, soweit ich die Sachlage verstehe.

        Du kannst von und nach Zeichensatz X nur die Zeichen übersetzen, die in dem Zeichensatz vorkommen. &rsquo; aka ’ gibt es in ISO-8859-1 nicht. Es ist aber Bestandteil von CP1252 aka Windows-1252 (Code: 0x92), weswegen es wohl in den in Word erstellten Texten vorkommt. Siehe http://de.wikipedia.org/wiki/ISO_8859-1.

        Die Verwendung von htmlentities() produziert jedoch Entities, die ich in get_html_translation_table() nicht finde.

        Du verwendest Zeichen, die in ISO-8859-1 nicht existieren. htmlentities() macht das, weil du "UTF-8" angibst, und das Zeichen darin enthalten ist. get_html_translation_table() basiert auf reinem ISO-8859-1 (also ohne CP1252), also ...

        Ich nehme an, komplett auf UTF-8 zu bauen, ist keine Option für dich?
        Das würde ich gerne tun, nur weiß ich nicht wie. Bei htmlentities() gebe ich UTF-8 bereits an - was kann ich noch tun?

        Wofür benötigst du die Entities? XML und die diversen XML-verarbeitenden Teile PHPs arbeiten bereits mit UTF-8. Wenn du keine weitere Stringverarbeitung mit den Werten machen möchtest, sie in PHP also nur durchreichst, brauchst du im Prinzip nichts weiter zu machen, als das fertige Dokument als UTF-8-kodiert zu kennzeichnen.

        [1] Meine Informationsquelle: http://cvs.php.net/viewvc.cgi/php-src/ext/standard/html.c?view=markup
        [...] soweit ich den Code zu lesen vermag, scheint UTF-8 hier weitgehend mit ISO-8859-1 identisch zu sein;

        Nur was den Code-Bereich 0xa0 bis 0xff angeht[2]. Es gibt noch weitere Bereiche, die sich in den ent_uni_*-Strukturen wiederfinden.

        die Stein-des-Anstoßes-Entity &quot; kommt hingegen nur bei CP-1252 vor. Leider bin ich somit verwirrter als zuvor ...

        Scheint mir auch so :-) Du meinst sicher &rsquo; - dazu siehe oben.

        ... dennoch vielen Dank für Deine Antwort :-)

        (K)einer reicht. :-)

        [2] Auf diesen Fall bezogen, ansonsten sind die ersten 256 Zeichen die gleichen wie ISO-8859-1.

        echo "$verabschiedung $name";