Hi!
Damit muss ich mich doch nochmal intensiver befassen. So ist mir das zu schwammig.
Dein Hinweis hat mich jetzt nochmal darauf gestoßen...
htmlspecialchars() interessiert sich für die Zeichen: &"'<>
Für die Ausgabe verwendet es: &;#039aglmopqtu
All das sind Zeichen aus dem ASCII-Bereich 0x00..0x7f, der bei ISO-8859 und UTF-8 exakt gleich ist. Es spielt also überhaupt keine Geige, welches charset man nun angibt. Es wird stets aus dem gleichen Input das gleiche Output erzeugt.
Anders ist die Sachlage bei htmlentities(), aber das benötigt man in aller Regel nicht, beziehungsweise ist es besser, seine Anwendung so zu bereinigen, dass man es nicht benötigt.
Die charset-Angabe wird lediglich für einige der asiatischen Kodierungen benötigt, denn da gibt es Kombinationen von Bytes, die zwar die "ASCII-Bytes" enthalten, aber für ein Nicht-ASCII-Zeichen stehen. Ein byteweises Bearbeiten führt also zur Zerstörung der Kombinationen.
Das gleiche Prinzip gilt für mysql_set_charset() versus SET NAMES im Zusammenhang mit mysql_real_escape_string(). Handelt man die Verbindungskodierung mit mysql_set_charset() aus, wird diese Kodierung von mysql_real_escape_string() berücksichtigt, bei SET NAMES hingegen nicht. Auch hier hat man wieder Probleme mit einigen asiatischen Kodierungen, nicht jedoch mit ISO-8859 oder UTF-8, weil ebenfalls alle interessierenden Zeichen nur im Bereich 0x00..0x7f angesiedelt sind.
Lo!