htmlentities() verwendet nicht get_html_translation_table()
Cheatah
- php
Hi,
folgende Situation:
Ein XML (<?xml version="1.0" encoding="UTF-8"?>) enthält <description>... "You’ 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’ 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 "’", 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
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";
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 " kommt hingegen nur bei CP-1252 vor. Leider bin ich somit verwirrter als zuvor ...
... dennoch vielen Dank für Deine Antwort :-)
Cheatah
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
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. ’ 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 " kommt hingegen nur bei CP-1252 vor. Leider bin ich somit verwirrter als zuvor ...
Scheint mir auch so :-) Du meinst sicher ’ - 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";