Bild vergrößern
475
458
http://img1.magnus.de/Zeichen-Codierungsproblem-beheben-r475x458-C-4bface4a-7636830.jpg
Workshop gegen das Chaos
MySQL-Codierungsproblem beheben: Nie wieder Umlaut-Chaos
Falsch dargestellte Umlaute sind selbst auf großen Websites keine Seltenheit. Der Workshop zeigt, wie Sie solche Probleme vermeiden oder beheben können.
Welche theoretischen Probleme in der Datenbank oder im Header auftauchen können, haben wir bereits in einer der letzten Ausgaben besprochen. Dabei ging es schwerpunktmäßig um Codierungsprobleme in MySQL-Datebanken.
Es gibt aber noch eine Vielzahl anderer Schwierigkeiten. Damit Sie Umlautprobleme gezielt beseitigen können, müssen Sie zuerst die Fehlerquelle lokalisieren. Um zu erkennen, an welchen Stellen es zu Fehlern kommen kann, rufen Sie sich den technischen Ablauf eines Seitenaufrufs in Erinnerung – hier schematisch anhand des Beispiels einer Foren-Software auf Basis von PHP umrissen:
1. Der Browser eines Clients sendet bei einem Seitenaufruf die HTTP-Anfrage an den Web-Server. Dieser leitet die Anfrage aufgrund der Dateiendung .php an den PHP-Interpreter weiter. PHP führt den Code der Datei aus und bindet dabei oft zusätzliche Sprachdateien ein.
2. PHP baut eine Verbindung zum MySQL-Server auf, um Daten (Texte) aus der Datenbank auszulesen oder zu speichern. MySQL nimmt die Anfrage entgegen, sucht die angefragten Daten aus den entsprechenden Datenbanktabellen zusammen und liefert die Ergebnisdatensätze zurück an PHP.
3. PHP generiert anhand der eingebundenen Sprachdateien und den vom MySQL-Server gelieferten Daten die Ausgabe in Form einer HTML-Seite, die an den Web-Server übergeben wird.
4. Der Web-Server liefert diese an den Client aus. Der Browser des Clients nimmt die Webseite entgegen, interpretiert sie und stellt sie dar.
Diese Liste von Zusammenhängen ist natürlich nicht willkürlich. Hinter jedem Punkt verbergen sich mögliche Fehlerquellen, die hier erörtert werden sollen. Grundsätzlich ergeben sich vier unterschiedliche Bereiche, die als Ursache in Betracht kommen:
• in der Datenbank abgelegte Texte sind falsch codiert
• die Kommunikation zwischen PHP und MySQL ist nicht auf einen Zeichensatz geeicht
• in Dateien gespeicherte Texte (Sprachvariablen, Templates) sind falsch codiert
• der Header der Webseite ist falsch oder nicht vorhanden.
Kopfsache
Jede ausgelieferte HTML-Seite sollte im Header eine Angabe besitzen, in der die Zeichencodierung hinterlegt ist, die vom Web-Server geliefert wird. Der Browser orientiert sich daran und stellt die Zeichen gemäß dieser Angabe dar.
Verwechseln Sie diese Angabe nicht mit dem Meta-Tag http-equiv, welcher sich im Quelltext im HEAD-Bereich der Seite befindet. Der hier gemeinte Header wird vor dem Ausliefern des eigentlichen HTML-Codes gesendet.
Ist die Zeichensatzangabe enthalten, so wird der nachfolgende Meta-Tag ignoriert. Er hat dann bestenfalls noch informativen Charakter für Suchmaschinen, aber keine steuernde Funktion mehr. Nur wenn die Angabe im Header fehlt, orientiert sich der Browser mangels anderer Informationsquellen am Meta-Tag.
Bei der Anzeige ist es nicht möglich Zeichensätze innerhalb einer einzelnen Webseite zu mischen. Stößt der Browser auf ein Zeichen, welches nicht im angekündigten Zeichensatz enthalten ist, so stellt er es mit einem Fragezeichen oder einem Rechteck als Platzhalter dar.
Intern wird anhand des ASCII/ANSI-Codes eines Zeichens in der entsprechenden Codierungstabelle nachgesehen, welches konkrete Zeichen für diesen Wert angezeigt werden muss. Um den im Kopf tatsächlich übermittelten Zeichensatz zu erkennen, ist Ihnen das Browser-Plugin Live HTTP Header eine große Hilfe. Es zeigt Ihnen die sonst nicht sichtbaren Informationen des Headers im Klartext an; unter anderem auch den vorgegebenen Zeichensatz (Charset) im Bereich Content-Type, wenn er angegeben ist.
Bild vergrößern
594
638
http://img2.magnus.de/Zeichen-Codierungsproblem-beheben-r594x638-C-15b2a9b7-7636896.jpg
Windows Notepad – durch Codierungsprobleme offenbar völlig überfordert.
Windows Notepad – durch Codierungsprobleme offenbar völlig überfordert.
Will man in einem mehrsprachigen Forum sowohl deutsche Umlaute (enthalten in Zeichensatz ISO 8859-1 oder latin1), als auch polnische Sonderzeichen (ISO 8859-2 oder latin2) anzeigen, so muss die Webseite in einer geeigneten Zeichencodierung ausgeliefert werden.
Da die Webseite nur einen Zeichensatz besitzen kann, eignet sich in diesem Fall keiner der beiden Zeichensätze, da sie sich gegenseitig ausschließen. Man benötigt also einen Zeichensatz, der sämtliche Sonderzeichen beider Sprachen enthält.
Hier bietet sich der Zeichensatz Unicode an, der mehr als 100.000 Zeichen aus über 600 verschiedenen Zeichensätzen in der Norm ISO 10646 vereint. Wird die Webseite in einem Unicode-Derivat – zum Beispiel im immer häufiger anzutreffenden UTF-8-Format – ausgeliefert, so lassen sich sowohl deutsche, als auch polnische Sonderzeichen problemlos anzeigen.
In welcher Codierung ein Browser die Daten interpretiert, können Sie leicht ermitteln. Unter Ansicht/Zeichenkodierung zeigt Ihnen Firefox an, welche Zeichencodierung er anwendet. In anderen Browsern gibt es die gleiche Funktionalität unter ähnlichen Menüpunkten.
Hier lässt sich bereits die erste und in der Praxis häufig auftauchende Fehlerquelle dingfest machen: Weicht nämlich die Meta-Tag-Angabe zum Zeichensatz von der im Header gesendeten ab, so ist die Wahrscheinlichkeit hoch, dass der Programmierer versäumt hat, eine entsprechende Angabe im Header zu platzieren oder sogar gar keinen Header sendet.
In vielen Foren herrscht noch die Meinung vor, dass es ausreiche, alleinig die Meta-Tag-Angabe im HTML-Teil zu setzen. Die meisten Web-Server erzeugen oder ergänzen den fehlenden Header in dem Fall jedoch um die fehlende Zeichensatzangabe mit einem Standardwert, der in der Konfiguration eines Apachen über die Direktive AddDefaultCharset gesetzt wird.