Wie man Umlaute korrekt verarbeitet und abspeichert

Das Problem



Mit der Zeit haben sich viele verschiedene Zeichensätze breitgemacht. Gängig in Europa ist z.B. der ISO8859-1 (latin1). Um bei Datenbanken aber auch mit anderen Zeichen keine Probleme zu bekommen, sollte man UTF8 wählen. Um genau zu sein utf8_unicode_ci und nicht utf8_general_ci oder utf8_bin, damit beim "ORDER BY"-Befehl die Sortierung passt. Allerdings ist utf8_general_ci schneller für Vergleiche als utf8_unicode_ci, arbeitet dafür eben weniger korrekt. Hinzu kommt, dass man bei vielen Hostern (bei mir: Host Europe) keinen Zugriff auf Konfigurationsdateien hat.

Die Lösung

Beim Erstellen der Datenbank muss der richtige Zeichensatz schon ausgewählt sein. Man kann ihn aber auch nachträglich ändern, was aber schief gehen kann, wenn bereits Daten in der Datenbank sind.


Anschließend muss mittels der header()-Funktion von PHP dem Browser mitgeteilt werden, wie er die Daten zu öffnen hat.


Bei dem Aufbau der MySQL-Verbindung muss "SET NAMES" definiert werden. Lässt man SET NAMES weg, funktioniert zwar das verarbeiten, abspeichern und anzeigen von Formulardaten problemlos, beim Bearbeiten in PHPMyAdmin und SQL Workbench sieht man in dem Fall aber weiterhin wirre Zeichen.


Zuguterletzt müssen im Editor die PHP-Dateien als UTF8 abgespeichert werden. Ich empfehle, durchgängig die Einstellung "UTF8 ohne BOM" zu wählen. Unter Umständen muss man den Menüpunkt nach dem Neuladen eines Dokuments erneut auswählen.


Nicht geholfen hat mir z.B. das Konvertieren von utf8 mittels decode() und encode(); auch der charset-Metatag und ein Eintrag in .htaccess hatten keinen Effekt.

Wenn man alles beachtet, kann man die Umlaute in seinem HTML-Quelltext auch ohne "&auml" schreiben.


Copy 'n' Paste

mysql_query("SET NAMES UTF8");
$db->query("SET NAMES 'utf8'");
header("Content-Type: text/html; charset=utf-8");

Bisher ungetestet: MySQL dumpen und reimportieren
http://blog.loftdigital.com/blog/php-utf-8-cheatsheet
http://www.phptherightway.com/
https://phpbestpractices.org/#utf-8


Quellen
http://www.peterkropff.de/allgemeines/zeichenkodierung/mysql_1.htm
 
© 2005-2015 DerMarki.de by Markus Schiele