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-8Damit 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-1Oder 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
- IP verkürzen
- mb_strrev - Multibyte-String umkehren
- is_utf8() – auf UTF-8 prüfen
- Herkunftsland des Besuchers ermitteln
- Geschwindigkeit von PHP-Scripts optimieren
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