Umlautproblem
September 2009
Nicht selten hat man, betrifft vor allem Anfänger, Probleme mit Umlauten und anderen Sonderzeichen, denn diese werden manchmal fehlerhaft dargestellt.
Schuld ist einerseits die Kodierung der Zeichen und andererseits deren Interpretation.
In folgenden Beispielen werden die verschiedenen Situationen dargestellt.
Dazu werden die Kodierungen UTF-8 und ISO 8859-1 (Latin-1) verwendet. Beide sind im Web häufig vertreten.
Wenn ein Dokument als Unicode (UTF-8) abgespeichert wurde, jedoch als ISO 8859-1 interpretiert wird, geschieht folgendes:
Mit PHP kann man dieses Problem umgehen indem man den entsprechenden Header ändert:
Andersherum kann man mit Hilfe der PHP-Funktion utf8_decode() die Kodierung der Ausgabe auf ISO 8859-1 ändern. Allerdings ist die Modifikation des Headers meist die praktikablere Lösung.
Wenn die Umlaute als Fragezeichen dargestellt werden, dann wird ein als ISO 8859-1 kodiertes Dokument als UTF-8 interpretiert. Dies stellt das Gegenstück zur oben genannten Situation dar.
Auch hier lässt sich mit PHP's header()-Funktion nachhelfen, damit der Content als ISO-8859-1 interpretiert wird.
Anmerkung: Das Ändern des Meta-Tags im HTML-Dokument betreffend "Content-Type" zeigt meistens keine Wirkung, da diese Angabe die niedrigere Priorität gegenüber dem HTTP-Header hat. Allerdings sollte der Meta-Tag immer auch dem HTTP-Header entsprechen, da, wenn die Datei lokal gespeichert wird, die einzige Quelle der Kodierung nur noch der Meta-Tag ist.
Siehe auch:
Schuld ist einerseits die Kodierung der Zeichen und andererseits deren Interpretation.
In folgenden Beispielen werden die verschiedenen Situationen dargestellt.
Dazu werden die Kodierungen UTF-8 und ISO 8859-1 (Latin-1) verwendet. Beide sind im Web häufig vertreten.
Wenn ein Dokument als Unicode (UTF-8) abgespeichert wurde, jedoch als ISO 8859-1 interpretiert wird, geschieht folgendes:
erwartete Ausgabe: ä ö ü
wirkliche Ausgabe: ä ö ü
Das ä wurde binär gesehen als 11000011 10100100 gespeichert. Die beiden Bytes gehören laut UTF-8 zusammen, werden in ISO 8859-1 allerdings auseinander genommen. Folglich wird aus 11000011 ein à und aus 10100100 ein ¤-Zeichen.Mit PHP kann man dieses Problem umgehen indem man den entsprechenden Header ändert:
<?php
header('Content-Type: text/html; charset=UTF-8');
?>
Oder dasselbe mittels .htaccess-Befehl:AddDefaultCharset UTF-8
Damit sollte der Browser den Inhalt korrekt als UTF-8 darstellen.Andersherum kann man mit Hilfe der PHP-Funktion utf8_decode() die Kodierung der Ausgabe auf ISO 8859-1 ändern. Allerdings ist die Modifikation des Headers meist die praktikablere Lösung.
Wenn die Umlaute als Fragezeichen dargestellt werden, dann wird ein als ISO 8859-1 kodiertes Dokument als UTF-8 interpretiert. Dies stellt das Gegenstück zur oben genannten Situation dar.
erwartete Ausgabe: ä ö ü
wirkliche Ausgabe: � � �
Mit anderen Worten wurde hier ein ä als 11100100 gespeichert. In UTF-8 ist dieses Byte jedoch ungültig, wird also nicht angezeigt oder ignoriert, bzw. als ? oder � dargestellt.Auch hier lässt sich mit PHP's header()-Funktion nachhelfen, damit der Content als ISO-8859-1 interpretiert wird.
<?php
header('Content-Type: text/html; charset=ISO-8859-1');
?>
In der .htaccess-Datei würde dies dann so aussehen:AddDefaultCharset ISO-8859-1
Oder aber man wendet utf8_encode() auf die Ausgabe an, um bei UTF-8 zu bleiben.Anmerkung: Das Ändern des Meta-Tags im HTML-Dokument betreffend "Content-Type" zeigt meistens keine Wirkung, da diese Angabe die niedrigere Priorität gegenüber dem HTTP-Header hat. Allerdings sollte der Meta-Tag immer auch dem HTTP-Header entsprechen, da, wenn die Datei lokal gespeichert wird, die einzige Quelle der Kodierung nur noch der Meta-Tag ist.
Siehe auch:
- header()
- .htaccess-Datei
- utf8_decode(), utf8_encode()
- is_utf8() · auf UTF-8 prüfen

Andere Einträge
- Dateien mit .htaccess gzip komprimieren
- IE und CSS
- IP verkürzen
- is_utf8() – auf UTF-8 prüfen
- If-Modified-Since nachbauen
Bei HTML sollte man die entsprechenden Entitäten, wie ä für ä ö für ü usw. nehmen, wie auch für andere Sonderzeichen (<>ß"....)
Siehe http://de.selfhtml.org/html/referenz/zeichen.htm
in der gennanten Website im habe ich das Menu durch ein php.inculde eingesetzt. Dazu habe ich in der .htaccess Datei folgendes eingegeben:
AddType application/x-httpd-php .htm .html
AddHandler x-httpd-php .htm .html
AddDefaultCharset ISO-8859-1
Den Charset habe ich eingegeben (Habe ich hier abgelesen), weil im Linktext das Wort Rätselspiele mit einem � vesehen war. Also nehme ich an das zweite Beispiel auf deiner Seite.
Im Artikeltext der Website aber, erscheinen die Umlaute nach dem ersten Beispiel.
Beide Befehle kann ich ja nich eingeben, wie gehe ich vor?
Bitte auch eine Mail wenn die Antwort kommt. (Fals nicht automatisch)
Danke für die SUPER-Info auf dieser Site. Hat mir sehr geholfen.
Ich ziehe meinen Hut.
Gerhard Kessler
Keine Ahnung, warum ich andere Artikel zu dieser Problematik nicht verstanden habe, aber dieser hat's gebracht! Herzlichen Dank für die verständliche Hilfe!
Dickes Lob aus München
Auf der Adminseite geben ich ein ö ein das wird in der Datenbank als ö gespeichert. Im Adminbeirech als auch im Shopbereich wird das so einwandfrei als ö angezeigt. Wenn ich aber im Shopbereich (z.b. Konto eröffnen) ein ö erfasse so wird das in der Datenbak als ã¶ gespeichert was wieder im Amdin als auch in Shop zu der Anzeige von � führt. Wo kann ich ansetzten um das Schreiben von Daten in dem richtigen Format zu erhalten?
Überprüfe ob die Tabellen der Datenbank alle das gleiche charset benutzen.
auch ich habe ein Charset-Problem: Zwar wird im Browser alles richtig dargestellt, beim Versenden des E-Mail-Formulars jedoch erhält der Empfänger fehlerhafte Darstellungen. Das ist besonders ärgerlich, weil es um Anmeldungen für einen Kindergarten geht. Wenn Umlaute im Namen vorkommen ist bei der Bürokraft heiteres Rätselraten angesagt. Wie kann ich dieses Problem lösen?
Danke für Eure HIlfe
Marianne
benutzt man den charset=UTF-8 dann muss die entsprechende Datei auch als UTF-8 Kodiert abgespeichert werden. Man benötigt also gar keine zusätzlichen Befehle in seinem Quellcode.
So einfach kann es sein aber die Menschheit mag es kompliziert und das ist auch gut so. :)
Alles auf den Punkt genau erklärt. So sollte es sein.
Eine Empfehlung wird es geben.
Danke für diese gute Seite.
Du warst meine Rettung, auch 6 Jahre nach Veröffentlichung sind Deine Tipps aktuell.
Jetzt kann ich endlich Text per php include richtig in einen UTF-8 Text einfügen.