Tach!
Der Browser benötigt die Information, in welcher Zeichenkodierung er meine index.html darstellen soll.
Nein. Er bekommt vom Server einen Bytestrom. Und diesen muss er richtig interpretieren, damit er weiß, welche Zeichen sich dahinter verbergen. Beispielsweise kommt ein Zeichen in ISO-8859-1 als Byte X daher und daselbe Zeichen UTF-8-kodiert hat die Bytes Y und Z. Y und Z stehen in ISO-8859-1 aber für zwei andere Zeichen. Der Browser benötigt also zu diesem Zeitpunkt keine Darstellinformation sondern eine Interpretationsinformation.
Wenn er die auf keine Weise übermittelt bekommen hat, gibt es wahrscheinlich einen Defaultwert in der Browserkonfiguration, der benutzt wird.
Er rät, so gut er kann. Das kann funktionieren, geht aber prinzipbedingt nicht in allen Fällen glatt.
Ansonsten wird, wenn die Information nicht vom Server kommt, das Metatag benutzt, was seinerseits keine Auswirkung hat, wenn im Header etwas anderes steht. Der kommt seinerseits vom Server, lässt sich aber mit php:header() überschreiben.
Richtig.
Jetzt soll in meiner index.php Content angezeigt werden, der zuvor aus einer MySql-Datenbank geholt wurde. Der Content enthält wieder ä,ü und ö. Ich würde nach der Verbindung zum MySQL-Server folgendes SQL-Statement absetzen:
mysql_query("SET NAMES 'utf8'");
mysql_set_charset() sollte zur Verfügung stehen, wenn deine PHP-Version nicht zu alt ist.
... danach den Content per SQL-Statement aus der DB auslesen, in eine Variable speichern und dann mit php:echo im Quellcode ausgeben.
Das echo mag im Quelltext stehen, aber das ist nebensächlich. Interessant ist, wohin die Werte ausgegeben werden. Jedenfalls ist Voraussetzung, dass auch MySQL die richtige Zeichenkodierung kennt und nicht in der Vergangenheit die Daten irgendwie, nur nicht unter Angabe der korrekten Kodierung gespeichert wurden. Überprüfen kann man das einfach mit dem phpMyAdmin, der sollte keine (Umlaut-)Fehler anzeigen, wenn alles korrekt ist.
- Bei der Konfiguration der DB lässt sich auch irgendwo etwas zu Zeichenkodierungen festlegen. Ist es notwendig, auch das anzupassen?
Jein. Empfehlenswert ist es, wenn die Kodierungsangabe der String-Felder (und zwar jedes einzeln) auf UTF-8 steht. Ansonsten kann das Feld nur die 255 ISO-8859-1/Latin1-Zeichen aufnehmen. Wenn die bisherige Kodierungsangabe zum Inhalt passt (z.B. PMA zeigt keine Fehler), dann kannst du die Angabe ändern und MySQL nimmt eine Umkodierung vor.
Aber selbst wenn in den Feldern Latin1 steht, kannst du mit MySQL UTF-8 sprechen (über mysql_set_charset() oder SET NAMES). MySQL liefert dir die Daten in der ausgehandelten Kodierung und kodiert dazu gegebenenfalls zwischen Feldinhalten und deiner Verbindung um.
- Wenn mein Content ausser 'ä','ü' und 'ö' z.B. '"' oder '<' enthält, dürften die ersten Probleme auftauchen und ich muss ihn also behandeln, bevor er dargestellt wird : htmlentinies() funktioniert nun nicht mehr, wenn ich's richtig gelesen habe und es muss statt dessen htmlspecialchars() verwendet werden. Richtig?
Der Kontextwechsel (Einfügen in HTML-Code) hat mit der Zeichenkodierung eigentlich nichts zu tun. Den musst du in jedem Fall beachten, und dazu ist htmlspecialchars() die richtige Funktion. Die beschränkt sich auf die HTML-eigenen Zeichen und lässt Umlaute und so weiter wie sie sind. Mit UTF-8 besteht keine Notwendigkeit, andere als die HTML-eigenen Zeichen zu ver-HTML-en.
dedlfix.