Umlautproblem

Nicht selten hat man, vor allem wenn man seine erste Webseite erstellt, 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 im Unicode-Format 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.

Die Lösung liegt darin, dem Browser über den HTTP-Header vorzugeben, mit welcher Kodierung dieser den Text interpretieren muss.

Mit PHP kann man das wie folgt machen:

<?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 mithilfe der PHP-Funktion utf8_decode() die Kodierung der Ausgabe zu ISO 8859-1 ändern. Allerdings ist die Modifikation des Headers meist die praktikablere Lösung.

In jedem Fall ist es empfohlen, die Zeichencodierung auch als Meta-Tag im HTML-Dokument anzugeben. Diese Angabe hat zwar die niedrigere Priorität gegenüber dem HTTP-Header, sollte aber trotzdem mit diesem übereinstimmen. Wenn die Datei lokal gespeichert wird, ist der Meta-Tag der einzige Hinweis zur Kodierung.

<head>
  <meta charset="UTF-8" />
  ...
</head>

Übrigens: Wenn Umlaute mit vier Zeichen dargestellt werden, z.B. als ü, dann deutet dies darauf hin, dass der Text doppelt in UTF-8 kodiert wurde. In diesem Fall muss man von Hand nachhelfen um den Fehler zu korrigieren, oder mit einem Skript die Kodierung mehrfach konvertieren.

� � �

Wenn Umlaute und Sonderzeichen 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, ignoriert, oder als � dargestellt.

Auch hier lässt sich in PHP mit der 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.

Weiterführende Artikel