“Warum werden auf meiner Seite Umlaute und Sonderzeichen falsch dargestellt?”
Nicht selten gibt es Themen auf php.de wie diese. Probleme mit Umlauten und anderen Sonderzeichen, die fehlerhaft dargestellt werden. In folgenden werden diese Situationen mit Hintergründen und Lösungen dazu, basierend auf den beiden Zeichenkodierungen UTF-8 (Unicode) und ISO 8859-1 (Latin-1), gezeigt.
Wenn ein Dokument als Unicode (UTF-8) abgespeichert wurde, aber als ISO 8859-1 interpretiert wird, geschieht folgendes:
Erwartete Ausgabe: ä ö ü Wirkliche Ausgabe: ä ö ü
Das ä
wurde binär gesehen als 11000011 10100100
gespeichert. Diese 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.
Was zu beachten ist, damit es zu keiner solchen Fehlinterpretation kommt, ist etwas weiter unten angeführt.
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 (ignoriert) bzw. als ?
oder �
dargestellt.
Was zu beachten ist, damit es zu keiner solchen Fehlinterpretation kommt, ist nachfolgend angeführt.
Checkliste für die durchgängige und korrekte Verwendung von UTF-8
header('Content-Type: text/html; charset=UTF-8');
. Der HTTP-Header hat (abgesehen vom BOM) die höchste Priorität bei der Bestimmung der Zeichenkodierung. <meta http-equiv=„content-type“ content=„text/html; charset=utf-8“ />
<meta charset=„utf-8“>
accept-charset=„utf-8“
sicherstellen) mysqli_set_charset()
. Siehe dazu auch MySQL und UTF-8 utf8_unicode_ci
. Siehe dazu auch MySQL und UTF-8 utf8_encode()
in UTF-8 überführt werden, wenn sie nicht als UTF-8 vorliegen (Datei, Windows-System, …). htmlspecialchars()
und htmlentities()
die Codierung mitgeben. Beispiel (HTML 5) für htmlspecialchars()
: function escape($s) { return htmlspecialchars( $s, ENT_QUOTES | ENT_HTML5 | ENT_DISALLOWED | ENT_SUBSTITUTE, 'UTF-8' ); }
utf8_encode()
behandelt wird.