htmlentities(), htmlspecialchars() und Sonderzeichen
Alex
- php
Hallo,
ich verwende in meinem Forum (http://alex.ilosuna.org/forum/) die Funktion htmlentities(), um Code in Einträgen zu "entschärfen". Es gab bisher keine Probleme, bis jemand das Forum auf slowenisch verwenden wollte: die Sonderzeichen wurden falsch dargestellt.
Nach langem Rumprobieren (wir dachten erst, es hat mit dem Charset zu tun) kamen wir darauf, dass es was mit der Funktion htmlentities() tu tun hat.
Nun gibt es ja auch htmlspecialchars(). Ist das nun besser dafür geeignet bzw. genauso sicher?
Danke und Grüße, Alex
Hallo,
Dein Problem hat IMHO durchaus mit Charsets zu tun.
Ich vermute, dass gewisse Browser die Sonderzeichen aus
Formularen "falsch" abschicken, z.B. mit einer falschen
oder fehlenden Charset-Angabe...
Nun gibt es ja auch htmlspecialchars(). Ist das nun besser dafür geeignet bzw. genauso sicher?
Radio Eriwan: "Im Prinzip Ja".
Bei einer korrekten Charset-Angabe koennen auch uncodierte
Sonderzeichen direkt im HTML-Quellcode stehen, siehe:
http://www.dodabo.de/charset/#s2
Also reicht es, die drei Zeichen <,> und " in Entities zu verwandeln.
In der Einleitung des oben genannten Textes steht aber ausdruecklich:
"Formulareingaben werden hier nicht behandelt."
Dafuer wird auf eine extra Seite verwiesen:
http://ppewww.ph.gla.ac.uk/~flavell/charset/form-i18n.html
Das hilft Dir ja vielleicht weiter.
Gruesse,
Thomas
der in E-Mail, Newsgroups und Foren konsequent nur ASCII 32 - 127
verwendet und auf Umlaute und aehnliches verzichtet ;-)
ich verwende in meinem Forum (http://alex.ilosuna.org/forum/) die Funktion htmlentities(), um Code in Einträgen zu "entschärfen". Es gab bisher keine Probleme, bis jemand das Forum auf slowenisch verwenden wollte: die Sonderzeichen wurden falsch dargestellt.
htmlentities() kann nur richtig arbeiten, wenn es weiß, in welchem Format die Quelldaten vorliegen. Anders gesagt: Du mußt der Funktion schon sagen, welcher Zeichensatz im PHP-Skript (und den per htmlentities() auszugebenden Datendateien) verwendet wird, falls es sich nicht um iso-8859-1 handelt.
Hierzulande ist das meistens kein Problem, weil die PHP-Vorgabe iso-8859-1 mehr oder weniger Standard und obendrein mit vielen anderen Zeichensätzen (iso-8859-15 und windows-1252) weitestgehend kompatibel ist.
Problematisch wird es aber schon, wenn man im PHP-Quellcode beispielsweise iso-8859-15 nutzt und ein Eurozeichen eintippt - das wird von htmlentities() standardmäßig in das allgemeine Währungszeichen umgewandelt. Vollkommen korrekt wohlgemerkt, denn was in iso-8859-15 das Eurozeichen ist, ist in -1 das Währungszeichen.
Daß die ganze Geschichte völlig zusammenbricht, wenn statt iso-1 irgendwas komplett anderes verwendet wird, sollte bei genauerer Betrachtung klar sein.
Bitte lies die Anleitung zu htmlentities().
Nun gibt es ja auch htmlspecialchars(). Ist das nun besser dafür geeignet bzw. genauso sicher?
Gut möglich, vorausgesetzt ihr gebt den richtigen (d.h. slowenischen) Zeichensatz entweder im Kopf per <meta> oder in der Webserverkonfiguration an (bitte _nicht_ beides _gleichzeitig_!).
Gruß,
soenk.e
Hallo Soenke,
Gut möglich, vorausgesetzt ihr gebt den richtigen (d.h. slowenischen) Zeichensatz entweder im Kopf per <meta> oder in der Webserverkonfiguration an (bitte _nicht_ beides _gleichzeitig_!).
Warum?
Was erwartest Du fuer Probleme?
Gemaess der HTML 4.01-Spezifikation hat die Charset-Angabe,
die vom Webserver im HTTP-Header angegeben wird, staerkeres Gewicht
als die Angabe im META-Tag. (Dieses ist nur ein "Lueckenbuesser"):
http://www.w3.org/TR/html401/charset.html#idx-character_encoding-6
Wenn aber beide Angaben uebereinstimmen (und korrekt sind),
sollte es IMHO doch keine Probleme geben. Theoretisch.
Hast Du Erfahrungen oder Literatur zum Thema?
Ich hab schon mal das gefunden:
http://ppewww.ph.gla.ac.uk/~flavell/charset/ns-burp.html
Der schlechte alte Netscape 4 hat offenbar ein paar Macken ("Burp"),
wenn ueberhaupt ein META-Charset angegeben wird.
Es wird empfohlen, das Charset wenn moeglich (nur) via HTTP anzugeben.
Gruesse,
Thomas
Gut möglich, vorausgesetzt ihr gebt den richtigen (d.h. slowenischen) Zeichensatz entweder im Kopf per <meta> oder in der Webserverkonfiguration an (bitte _nicht_ beides _gleichzeitig_!).
Warum?
Ein- und dieselbe Angabe an mehreren verschiedenen Orten zu machen ist nicht unbedingt inakzeptabel, aber es ist trotzdem besser, diese Angabe an nur einer zentralen Stelle zu halten.
Es mag Vorschriften geben, die regeln, welcher Angabe Vorzug zu gewären ist, das hilft aber nichts, wenn die Orte unterschiedlichen Personen unterstehen und möglicherweise obendrein eine dieser Personen nichts von der Existenz mehrerer Orte weiß.
Und es hilft nichts, wenn dafür gesorgt wird, daß alle Orte immer denselben Wert enthalten, wenn es Software geben könnte, die sich nicht an die Vorschriften hält.
Und das alles ist vollkommen egal, betrachtet man den Hang zur Vergesslichkeit mancher Personen ("Ich ändere das hier und den anderen mach' ich nach der Pause..").
Von daher halte ich es zumindest theoretisch für äußerst sinnvoll, von Anfang an eine strikte Linie zu fahren: entweder - oder.
Gruß,
soenk.e