Hallo,
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.
ja, das ist wohl ein sehr feiner aber vielleicht wesentlicher Unterschied. Ich habe lange überlegt, ob das nicht genau das ist, was ich meinte.
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.
Unter PMA wird derzeit alles korrekt dargestellt. Ich gehe also davon aus, dass die Daten in meiner MySQL zusammen mit dem richtigen Zeichensatz gespeichert worden sind. Woher aber kannte MySQL den korrekten Zeichensatz?
Bzw. was ist ausschlaggebend gewesen? Es gibt scheinbar den "Zeichensatz der Verbindung" zwischen MySQL und den Zeichensatz von MySQL-Tabellen bzw. sogar einzelner Felder?
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.
Ich verstehe das so:
--------------------
MySQL(-Tabellen bzw. Felder) enthalten eine Kodierungsangabe (was wohl das ist, was man beim Anlegen der Tabellenstruktur festlegt). Hole ich mir die Daten in einem PHP-Skript per SQL-Statement dort ab, speichere sie dann in einer php-Variable, steht in dieser Variablen mein Content auf diese Weise kodiert. Will ich a) diese Daten dann im Browser ausgeben, muss für die Ausgabe die selbe Kodierung eingestellt sein.
Sprich: Daten aus einer MySQL-Tabelle mit der Zeichenkodierung Latin1 werden in meiner PHP-Variablen gespeichert. Wird der Inhalt dieser Variablen beim Aufruf meiner index.php im Browser ausgegeben und steht im Header, bzw. Metatag die selbe Zeichenkodierungsangebe, in dem Fall also ISO-8859-1 wird der Inhalt der Variablen korrekt angezeigt und zwar unabhängig davon, mit welcher Zeichenkodierung index.php gespeichert wurde.
Was verbirgt sich aber wohl hinter der Kodierung der Verbindung?
Ist damit die Umkodierung gemeint? Sprich, nur wenn php die Daten aus der Latin1-Tabelle als UTF-8 kodiert zur Verfügung gestellt bekommen soll, muss php der DB mit mysql_set_charset() mitteilen, dass sie die Daten als UTF-8 liefern (also umwandeln) soll.
Interessant wäre dann auch, wie die Anweisung in umgekehrter Richtung (also Daten in der MySQL-DB speichern) funktioniert.
- 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.
Dann habe ich wohl noch etwas falsch verstanden ;)
Ich meinte, dass a) 'ä','ü' und 'ö' im HTML-Quelltext bei einheitlich richtiger Zeichenkodierung weder in UTF-8 noch ISO-8859-1 maskiert werden müssen, damit sie richtig dargestellt werden die Zeichen '"' und '<' hingegen unabhängig von der Zeichenkodierung im HTML-Quelltext immer zu Problemen führen. Und dass während htmlentities(), was 'ä','ü' und 'ö' genauso wie '"' und '<' maskieren würde zwar mit den ISO-kodierten Daten umgehen kann, mit UTF-8-kodierten Daten aber nicht, für htmlspecialchars() die unterschiedliche Kodierung keine Rolle spielt. Ist also multibyte-sicher?
tausend Dank für Tipps und
beste gruesse,
heinetz