Moin!
Ziel:
korrekte Darstellung von Zeichen in utf-8 encoding (insbes. Umlauten usw) auf html Seiten, die über PHP oder xmlhttprequest geladen werden.Lösung:
Alles, was du bezüglich HTML schreibst, ist korrekt. Es ist, um sicher zu gehen (manche Browser machen sonst möglicherweise Mist), für die Formularverarbeitung an den drei Stellen (HTTP-Header, Metatag, accept-encoding-Attribut) die Angabe "utf-8" notwendig.
Aber in dem entscheidenden Punkt irrst du: Die Verarbeitung von UTF-8 mit PHP und Datenbank erfordert KEINESFALLS (!!!) die Verwendung von utf8_decode() oder utf8_encode()!
Wird nun ein solches Formular via HTTP verschickt, so erreicht es den Webserver und damit PHP in der x-www-form-urlencoded Form. Um nun die mitgeschickten Werte in der mySql-DB zu speicher müssen diese decodiert werden:
<?php
$str = utf8_decode($_POST['formularfeld1']);
$sql = "UPDATE mytable SET myfield='{$str}' WHERE ...";
?>
Mit utf8_decode() wandelst du den UTF-8-codierten String in einen ISO-8859-1-String.
Dabei gehen dir unwiderruflich Zeichen verloren. Darunter so wichtige Zeichen wie das Eurozeichen, welches in ISO-8859-1 nicht definiert ist.
Dann wandert der String in eine UTF-8-fähige Datenbank.
Und wird wieder ausgelesen und mit utf8_encode() wieder von ISO-8859-1 in UTF-8 gewandelt (verlorene Zeichen werden NICHT wiederhergestellt).
Offensichtlich hat die Verbindung zur Datenbank bei dir keine Ahnung davon, dass UTF-8 gesendet und gelesen werden soll, sondern benutzt ISO-8859-1.
Und das kriegt man ganz simpel geändert, indem man als allerersten SQL-Befehl folgendes macht:
<?php mysql_query("SET NAMES UTF-8"); ?>
Damit wird MySQL mitgeteilt, dass alle Querystrings, die die Datenbank erhält, im UTF-8-Schema codiert sind, und das alle Ergebnisse in dieser Codierung zurüchgegeben werden sollen.
Und schon erspart man sich die Zeichenverluste durch die sinnlose Konvertierung in ISO-8859-1.
Sorry, dass ich es so deutlich formuliere, aber dein Posting ist leider absolut nicht fachlich hilfreich, weil deine Lösung erhebliche Mängel aufweist und das Problem nicht grundsätzlich löst. Du arbeitest eben gerade NICHT in einer UTF-8-Umgebung, sondern schränkst diese auf Zeichen ein, die in ISO-8859-1 vorkommen. Und das sind verdammt wenige.
Datenbankenversionen, die UTF-8 noch nicht kennen, arbeiten auch ohne den zusätzlichen SQL-Befehl korrekt, da UTF-8 in 8-Bit-Systemen transparent verarbeitet werden kann.
- Sven Rautenberg
"Love your nation - respect the others."