dedlfix: Modrewrite PHP to Images (Achtung Anfänger)

Beitrag lesen

Tach!

Was ist eigentlich der Unterschied zwischen htmlspecialchars() und htmlentities()? Bei php.net steht nur, dass htmlentities() wirklich alle Zeichen umwandelt. Aber welche sind das? Und warum werden die von htmlspecialchars() weggelassen?

Es sind nicht alle, aber trotzdem zu viele. Der deutsche Text schreibt

"... allerdings wandelt htmlentities() wirklich alle Zeichen, die eine HTML-Code-Entsprechung haben, ..."

Die englische Original-Passage dazu ist:

"...except with htmlentities(), all characters which have HTML character entity equivalents..."

Das "wirklich" ist da verwirrend und meiner Meinung nach falsch übersetzt. Die Auflösung jedenfalls, welche Zeichen "eine HTML-Code-Entsprechung" im Sinne PHPs haben (sprich: wenn es ein Entity dazu gibt, also beileibe nicht sämtliche Zeichen außerhalb ASCIIs), liefert die Funktion get_html_translation_table().

htmlspecialchars() behandelt nur die "wirklich" notwendigen Zeichen, die da wären &, <, > und je nach Parametern " und '. Diese müssen berücksichtigt werden. Das heißt nicht, dass sie unter allen Umständen umgeschrieben werden müssen. Man muss das auch wieder kontextbezogen betrachten. Ein " zum Beispiel muss nur als &quot; notiert werden, wenn es Teil des Wertes eines Attributes ist. Im laufenden Fließtext ist es nicht notwendig, aber auch nicht schädlich.

Die anderen Zeichen in ihre Entity- oder NCR-Form zu bringen ist nur eine Notlösung, wenn man nicht auf UTF-8 umsteigen kann. Denn dann kann man sie direkt notieren. Sich mit ISO-8859-1 und Entitys/NCRs für die Zeichen außerhalb dieser Kodierung rumzuschlagen ist generell keine kluge Idee. Wenn solche Zeichen im Browser eingegeben werden und der sie nicht in die angegebenen Kodierung bringen kann, dann gehen sie verloren oder sind in ihrer Ersatzschreibweise nicht von "normalen" Zeichen zu unterscheiden.

Gibt man zum Beispiel 中 zusammen mit einem wörtlich gemeinten &amp; ein, so senden einige Browser das - wenn sie zu ISO-8859-1 gezwungen werden - als &#20013; und &amp;. Wie unterscheidest du nun die Ersatzschreibweise &#20013; von dem wirklich so eingegebenen &amp;? Das Beispiel mag etwas konstruiert erscheinen, aber einerseits ist das Problem auch bei einem einfachen & nicht einfacher lösbar und andererseits hast du ja selbst gesehen, wie schnell aus einem & gefolgt von para ein Entity erkannt wird.

dedlfix.