Umlaute richtig darstellen

Ein Workaround für die Lösung des Umlauteproblems

Die Ursache für das Umlauteproblem liegt in der Zeichenkodierung. Für jede Sprache gibt es eine Kodierung für deutsch gleich mehrere. Allerdings hat sich UTF-8 durchgesetzt und deshalb will ich in diesem Workaround auch auf diese Codierung eingehen.

Zunächst muss dem Browser mitgeteilt werden, wie die Website kodiert ist, mit der wir ihn gleich beliefern. Das geschieht im head und sollte in etwa so aussehen:

<!doctype html> <html> <head> <title>Dein Seitentitel</title> <meta charset="utf-8"> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <meta http-equiv="language" content="de"> <meta http-equiv="content-language" content="de"> <meta name="language" content="deutsch, de">

Im zweiten Schritt geht es darum, die Daten mit UTF-8 zur Verfügung zu stellen. Diese Daten kommen von einer MySQL-Datenbank. Die sollte komplett auf utf8_general_ci eingstellt sein. Das beginnt bei der Datenbank an sich (z.B. PHPMyAdmin > Operationen), dann jede einzelne Tabelle und schließlich jedes Feld, das Text enthalten kann.

Nun sollte man meinen, das war's, aber dem ist leider noch nicht ganz so. Oft erlebt man, dass die lokale XAMPP-Installation alles wie gewünscht macht, dann überträgt man das Projekt zum XAMPP-System des Kunden oder auf einen Web-Server und schon hat man sie wieder, die dämlichen Rauten mit Fragezeichen oder sonstigen kryptischen Zeichen.

Wie kommt's? Es kommt darauf an, wie der Datenbank-Engine die Daten kodiert. Das hängt von der jeweiligen Installation ab. 

Man kann dies mit einem sehr wirkungsvollen Trick festlegen.

Wenn du zum Öffnen der Datenbank ein kleines Script verwendest, das du in jede Seite einbindest, dann sieht das z.B. so aus:

<?php $server = "host"; $user = "username"; $pass = "passwort"; $dbase = "dbname"; $mysqli = new mysqli($server, $user, $pass, $dbase); if ($mysqli->connect_errno) { die("Die Verbindung zur Datenbank klappte leider nicht."); } // hier wird der controller angewiesen, utf8 zu verwenden: $mysqli->query("set names utf8"); ?>

Und zum Schluss sorgen wir noch dafür, dass die Daten bei Übermittlung im richtigen Format ankommen.

<form action="zielseite.php" method="post" name="frm_name" accept-charset="utf-8"> bzw. wenn die Daten per AJAX gesendet werden: $.ajax({ url : "zieldatei.php", type: "POST", data : ajaxdata, contentType: "application/json; charset=utf-8", success: function(data, textStatus, jqXHR) { // do something after sending }, error: function (xhr, ajaxOptions, thrownError) { console.log("Fehler:" + xhr.responseText+" - "+thrownError); } });

Damit sind alle Fehlerquellen ausgeräumt und die deutschen Umlaute werden fehlerfrei angezeigt.