Das Geheimnis der Zeichencodierung
Einfach gesagt ein Problem, mit dem sich viele erst dann beschäftigen, wenn sie auf einmal beim Entwickeln so komische Zeichen in ihrem Browser sehen und nicht wissen, wo sie herkommen. Normalerweise tritt das Phänomen immer dann auf, wenn zum ersten Mal mit
Unicode,
oder genauer gesagt mit
UTF-8 gearbeitet wird und der Editor die Datei als
ANSI/ASCII öffnet.
Der Scriptly ist in der aktuellen Version auch nicht in der Lage UTF-8 codierte Dokumente korrekt zu öffnen.
Lesen Sie dazu auch diese Beiträge:
Zeichensätze
Eine wichtige Unterscheidung, die man verstanden haben sollte, ist die zwischen Zeichenkodierung und Zeichensatz.
Ein kodierter Zeichensatz ist ein Satz von Zeichen, der jedem Zeichen einen eindeutigen Zahlenwert zuweist. Zeichenkodierung bezieht sich darauf, wie diese abstrakten Zeichen entsprechenden Bytes zugeordnet werden, damit sie ein Computer verarbeiten kann.
Der Siegeszug des Computers begann bekanntlicher weise in den USA. Die Amerikaner kümmerten sich anfangs auch nur um ihre Buchstaben des Alphabets. Das Ergebnis war der ASCII-Zeichensatz. Und auf dem bauten dann andere wie zum Beispiel
ISO-8859-1 auf.
ASCII oder ANSI
Des Öfteren wird ANSI gerne als Synonym für ASCII genommen, auch wenn das nicht ganz stimmt. Selbst im Scriptly findet man es. Die Varianten des erweiterten ASCII-Codes nennt man ANSI und ISO-8859. ASCII und ANSI sind Zeichencodes, bei denen je ein Textzeichen durch 8 Bits (1 Byte) codiert wird. Für die Länder unabhängigen Zeichen reichen sogar nur 7 Bits aus, und nur diese sind streng genormt.
Für die Codes 0…127 sind die ASCII-Zeichen und ANSI-Zeichen identisch und länderübergreifend.
Die darüber liegenden Codes von 128…255 sind Länder abhängig und bei ASCII und ANSI unterschiedlich belegt.
Unicode und UTF-8
Mit Unicode wollte man eigentlich ein Zeichensystem schaffen, das möglichst viele “Buchstaben” umfasst. Die am weitesten verbreite Kodierung nennt sich UTF-8.
Das Problem, wenn man mit UTF-8 arbeitet, so müssen alle Daten, die Text beinhalten oder ausgeben, entsprechend kodiert werden!
Und genau das ist der Grund, warum Anfänger immer wieder mit denselben Probleme haben.
Bevor Sie UTF-8-basierte Zeichen in ein HTML-Dokument einfügen möchten, so muss das Dokument ebenfalls über dieselbe Kodierung verfügen.
Ändern Sie die Kodierung zu “UTF-8 ohne
BOM“. Wenn ein BOM in UTF-8-codiertem Inhalt vorkommt, kann es auf Webseiten oder in Editoren zu Leerzeilen oder unerwarteten Zeichen () führen. Darum ist es aus Interoperabilitäts-Gründen am besten, das BOM bei UTF-8-codiertem Inhalt wegzulassen.
Unter
PHP kann es da zu gewaltigen Problemen kommen. Also gewöhnen Sie sich schon mal daran.
HTTP-Content-Type-Header
Der HTTP-Content-Type-Header, der vom Server verschickt wird,
ist die Standardmethode, um die Zeichenkodierung zu bestimmen.
Diese Methode hat Vorrang gegenüber anderen Optionen in der nachfolgenden Liste.
Hier ein Beispiel für die Content-Type-Zeile, die als Teil des HTTP-Headers verschickt wird:
-
Content-Type: text/html; charset=utf-8
In HTML/XHTML kann man den Meta-Tag Content-Type benutzen.
Er wird im Head-Bereich einer Seite untergebracht, wobei die Zeichenkodierung
mit der Eigenschaft charset angegeben wird:
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
Ein ASP.NET-Entwickler kann zum Beispiel die folgende Zeile verwenden:
-
<%Response.charset="utf-8"%>
Die XML-Deklaration in der ersten Zeile einer Seite zur Angabe der Zeichenkodierung.
<?xml version="1.0" encoding="UTF-8"?>
Der PHP-Entwickler kann diese Zeile einfügen:
<? header('Content-type: text/html; charset=utf-8'); ?>
Muss die Zeichenkodierung auch in Stylesheets angegeben werden?
Das fragen sich jetzt sicher viele von Ihnen. Und das ist auch völlig berechtigt, denn normalerweise ist es völlig irrelevant, wenn man die CSS-Datei als ANSI ausliefert. Aber einen Sonderfall gibt es schon. Bei Datei-Namen sollte man niemals mit
Leerzeichen,
Sonderzeichen oder zum Beispiel
deutschen Umlauten arbeiten. Denn hält man sich nicht daran, so bekommt man Probleme.
Um auf Nummer sicher zu gehen, sollte man bei einer UTF-8-Kodierung zusätzlich im Kopf der CSS-Datei noch folgende Angabe machen. Das ist nach meinen bisherigen Erfahrungen nicht unbedingt nötig, aber es kann auf jeden Fall helfen Probleme zu vermeiden.
-
@charset "UTF-8";
Der BOM ist auch ein sehr häufig auftretender Fehler!
Bei der UTF-8-Codierung ist im Gegensatz zu UTF-16 kein BOM erforderlich, denn dort gibt es nur eine mögliche Reihenfolge der Bytes. Das BOM kann dennoch in UTF-8-codiertem Text auftreten, entweder als Nebenprodukt einer Umwandlung der Zeichencodierung oder weil es durch ein Editor-Programm hinzugefügt wurde. In diesem Fall spricht man auch von UTF-8-Signatur.
Hinweis: Das BOM wird auch bei UTF-32 gekennzeichnetem Text verwendet und soll nicht für UTF-32BE oder UTF-32LE gekennzeichnetem Text verwendet werden. Von der Verwendung von UTF-32 für HTML-Inhalt wird stark abgeraten.