===== Seltsame Zeichen ===== > “Warum werden auf meiner Seite Umlaute und Sonderzeichen falsch dargestellt?” ==== Warum? ==== Nicht selten gibt es Themen auf [[http://www.php.de/|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. ==== Situation 1 ==== 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 [[#konsequent-utf-8|etwas weiter unten]] angeführt. ==== Situation 2 ==== 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 [[#konsequent-utf-8|nachfolgend]] angeführt. ===== Lösung: Nutze konsequent UTF-8 ===== **Checkliste für die durchgängige und korrekte Verwendung von UTF-8** * PHP- und HTML-/Template-Dateien im Editor als “UTF-8 ohne BOM” speichern. Dies betrifft auch alle etwaigen serverseitigen inkludierten Dateien. * HTTP Header Content-Type mit UTF-8 verwenden. ''header%%('%%Content-Type: text/html; charset=UTF-8');''. Der HTTP-Header hat (abgesehen vom [[http://www.w3.org/International/questions/qa-html-encoding-declarations#bom|BOM]]) [[http://www.w3.org/International/questions/qa-html-encoding-declarations#question|die höchste Priorität]] bei der Bestimmung der Zeichenkodierung. * HTML-meta-Tag\\ HTML 4.x: ''''\\ HTML 5: '''' * Formulardaten (falls explizit nötig) in UTF-8 übergeben (ggf. mit ''accept-charset="utf-8"'' sicherstellen) * Datenbankverbindung von PHP zur Datenbank auf UTF-8 stellen. Siehe z.B. [[..:.#create-conn|hier für PDO]]. Für mysqli gibt es die Methode ''mysqli_set_charset()''. Siehe dazu auch [[..:.|MySQL und UTF-8]] * Datenbank Zeichensatz UTF-8, Tabellenkollationen ''utf8_unicode_ci''. Siehe dazu auch [[..:.|MySQL und UTF-8]] * Daten aus Fremdquellen müssen mittels ''utf8_encode()'' in UTF-8 überführt werden, wenn sie nicht als UTF-8 vorliegen (Datei, Windows-System, …). * Bei der Anwendung von ''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' ); } * Generell ist darauf zu achten, das es zu keinen “Überkodierungen” kommt, zB wenn ein bereits als UTF-8 kodierter String erneut mittels ''utf8_encode()'' behandelt wird. ===== Weiterführende Links / Quellen ===== * [[http://www.w3.org/International/questions/qa-html-encoding-declarations|Angabe der Zeichencodierung in HTML (W3C)]] * [[http://www.w3.org/International/questions/qa-what-is-encoding|Zeichencodierung für Anfänger (W3C)]] * [[http://www.php.de/forum/webentwicklung/php-einsteiger/1448531-umlaute-im-tiptext?p=1448599#post1448599|Auflistung gesammelter Punkte von jspit (php.de)]] * [[http://floern.com/webscripting/umlautproblem|Umlautprobleme (floern.com)]]