Wie das HTML beginnt, ist weniger interessant, wichtiger ist die Kodierungsangabe im Header. Die Angabe im HTTP-Header sticht zwar, wenn sie vorhanden ist, aber das ist sie nicht immer. Beim lokalen Speichern ist sie zum Beispiel nicht mehr da. Das ist zwar für dein aktuelles Problem nicht relevant, aber wenn du schonmal beim Korrigieren bist ...
Joa, mal sehen... eigentlich ginge ich davon aus, dass der Browser die Datei dann auch im entsprechenden Zeichensatz speichert.
Aber man kann es rein schreiben, sicherlich (ich mag das meta-Element nur irgendwie nicht).
Ich hab das nur dazu geschrieben weil es ja auch "irgendwas mit Zeichensatz" zu tun hat und wollte die möglicherweise aufquellende Frage vorab beantworten. (wie sich das gehört in technischen Foren, alle möglicherweise relevanten Infos geben)
Als "relevant" sah ich hier an "alles was mit Charsets zu tun hat".
Hier könnte noch ein accept-charset-Attribut hinzugefügt werden, aber zumindest einige ältere Browser ignorieren das. Üblicherweise reicht die Kodierungsangabe im HTTP-Header oder HTML-Head.
Ah okay, ich schau's mir an. (ältere Browser... pfff ich berücksichtige normalerweise Textbrowser und Mobilbrowser aber halbwegs aktuell sollten sie sein)
Und Regel 2? Wird immer wieder gern nicht beachtet. Woher soll MySQL wissen, was du ihm da übergibst?
Nun es hätte durchaus sein können, dass der Parser das von selbst tut oder dass SQL davon ausgeht, dass es den Zeichensatz kriegt, den ich dort eingestellt habe.
Da fehlt noch die Kontextwechselbeachtung, also ein htmlspecialchars(). Ansonsten hebt hier derselbe Fehler beim Hin- und Rückweg das Problem teilweise wieder auf.
Stimmt, bei manchen Feldern muss ich das machen, aber in den meisten kommt kein <>&" vor.
Du hast aber Recht, beim Schreiben in die DB bzw. auch allen Abfragen escape ich aus Sicherheitsgründen (wenn es geht mit (int)) dann sollte man es beim Auslesen genauso konsequent tun XD
Derartige Probleme kommen recht häufig vor, weswegen ich im SELFHTML-Wiki einen Themenschwerpunkt zur Zeichenkodierung angefangen habe. Die wichtigsten für dich relevanten Teile sind schon ausgearbeitet.
Ah cool danke, tatsächlich hat dies hier geholfen:
$db_link = mysql_connect ($db_data['host'], $db_data['user'], $db_data['password']);
if ($db_link) {
mysql_select_db( $db_data['database'] );
mysql_set_charset('utf8');
}
Also die vorletzte Zeile ist freilich neu.
dedlfix.
Vielen Dank und frohes neues Jahr!