Zeichencodierung für Anfänger

Question

Was ist eine Zeichencodierung und warum sollte ich mich damit beschäftigen?

Answer

Zunächst: Warum sollte ich mich damit beschäftigen?

Wenn man irgendwelche anderen Zeichen verwendet als die elementaren im Englischen gebräuchlichen, dann kann es sein, dass andere den Text nicht lesen können, wenn nicht angegeben wurde, welche Zeichencodierung verwendet wurde.

Wenn der Text bspw. so aussehen sollte:

mojibake1.gif

dann kann es sein, dass er so dargestellt wird:

mojibake2.gif

Ist die Zeichencodierung nicht richtig angegeben, leidet nicht nur die Lesbarkeit des Textes; es kann auch bedeuten, dass die Inhalte von Suchmaschinen nicht gefunden oder anderweitig nicht richtig weiterverarbeitet werden können.

Was also ist eine Zeichencodierung?

Wörter und Sätze eines Textes werden aus Zeichen gebildet. Beispiele für Zeichen sind der lateinische Buchstabe á oder das chinesische Schriftzeichen oder das Devanagari-Zeichen .

Zeichen werden zusammengefasst in einem Zeichensatz (auch Zeichenvorrat oder Repertoire genannt, englisch: character set). Dieser wird als codierter Zeichensatz (englisch: coded character set) bezeichnet, wenn jedem Zeichen eine Nummer zugeordnet wird: der Zeichencode (englisch: codepoint). Diese Zeichencodes werden im Computer durch ein oder mehrere Bytes repräsentiert.

Die Zeichencodierung (englisch: character encoding) ist der Schlüssel, der Zeichencodes in Bytes im Speicher des Computers umsetzt und Bytes wieder in Zeichencodes zurückverwandelt.

Sie können sich das im Prinzip so vorstellen: Alle Zeichen werden im Computer mittels eines Codes gespeichert, wie Chiffren in der Spionage. Die Zeichencodierung ist der Schlüssel, um diesem Code zu knacken. Sie ist die Menge der Zuordnungen zwischen den Bytes, die im Computer für Zahlen stehen, und den Zeichen im Zeichensatz. Ohne diesen Schlüssel sehen die Daten nur wie Müll aus.

Der missverständliche Begriff charset (Zeichensatz) wird oft auch fälschlicherweise für Zeichencodierungen verwendet. Man sollte sich dessen bewusst sein, selbst aber möglichst immer den Begriff Zeichencodierung dafür verwenden.

Unglücklicherweise gibt es viele verschiedene Zeichensätze und Zeichencodierungen, d.h. viele verschiedene Zuordnungen zwischen den Bytes, den Zeichencodes und den Zeichen. Für Interessierte geht der Abschnitt Weitere Informationen tiefer ins Detail.

Meist muss man nicht alles genau bis ins letzte Detail wissen. Es genügt, die Ratschläge im Abschnitt Was bedeutet das für mich? weiter unten zu beachten.

Was spielen Schriftarten für eine Rolle?

Eine Schriftart (englisch: font) enthält die Glyphen-Definitionen, d.h. die Definitionen der Gestalt der Zeichen.

Hat das Anwendungsprogramm erst einmal herausgefunden, mit welchen Zeichen es zu tun hat, sucht es in der Schriftart nach Glyphen, um diese Zeichen darzustellen oder auszudrucken. (Wenn die Zeichencodierung falsch angeben ist, wird natürlich nach Glyphen für die falschen Zeichen gesucht.)

Eine bestimmte Schriftart deckt üblicherweise einen Zeichensatz ab, oder bei größeren Zeichensätzen wie Unicode nur einen Teil aller Zeichen in diesem Zeichensatz. Wenn eine Schriftart keine Glyphe für ein bestimmtes Zeichen bereitstellt, suchen manche Anwendungsprogramme nach dem fehlenden Zeichen in anderen auf dem System installierten Schriftarten (was zur Folge hat, dass die Glyphe anders aussieht als der Text drumherum, wie in einem Erpresserbrief). Ansonsten wird stattdessen ein Rechteck, ein Fragezeichen oder irgendein anderes Zeichen angezeigt. Zum Beispiel:

mojibake3.gif

Was bedeutet das für mich?

Als Autor oder Entwickler sollte man heutzutage UTF-8 als Zeichencodierung für seinen Inhalt oder seine Daten wählen. Diese Unicode-Codierung ist dabei eine gute Wahl, denn man kann einunddieselbe Codierung für so ziemlich alle Zeichen verwenden, die man je antreffen wird. Dies vereinfacht die Sache enorm. Die Verwendung von Unicode durch das ganze System hinweg macht die Beachtung wechselnder Zeichencodierungen und Umwandlungen von einer in eine andere unnötig.

Inhaltsautoren müssen wissen, wie man bei dem verwendeten Dokumentformat die Zeichencodierung angibt.

Es ist jedoch zu beachten, dass einfach nur eine andere Zeichencodierung anzugeben die Bytes nicht ändert; man muss den Text auch in dieser Codierung speichern. Autoren müssen überprüfen, in welcher Codierung Editoren oder Scripte Text speichern und wie man Text UTF-8-codiert speichert. Es ist auch zu prüfen, ob der Server die Dokumente mit den richtigen HTTP-Angaben ausliefert.

Entwickler müssen sicherstellen, dass verschiedene Teile eines Systems miteinander kommunizieren können und dass diese verstehen, welche Zeichencodierungen verwendet werden, und die nötigen Codierungen und Zeichen unterstützen. (Idealerweise verwendet man überall UTF-8 und vermeidet damit diese Probleme.)

Die Links weiter unten geben weitere Informationen zu diesen Themen.

Weitere Informationen

Für Interessierte gibt der folgende Abschnitt weitere Informationen zum Zusammenhang von Bytes, Zeichencodes und Zeichen. Sie können ihn aber auch überspringen und zum Abschnitt Literaturhinweise gehen.

Im codierten Zeichensatz ISO 8859-1 (auch als Latin1 bezeichnet) ist der Zeichencode des Buchstaben é 233 (dezimal). In ISO 8859-5 aber repräsentiert derselbe Zeichencode den kyrillischen Buchstaben щ.

Diese Zeichensätze enthalten weniger als 256 Zeichen und ordnen die Zeichencodes direkt den Bytewerten zu, sodass der Zeichencode 233 von einem Byte mit dem Wert 233 repräsentiert wird. Der Kontext entscheidet, ob dieses Byte für é oder щ steht.

Es gibt dennoch Möglichkeiten, Zeichen aus verschiedenen Schriften in den Griff zu bekommen. So sind im Unicode-Zeichensatz beide Zeichen in einunddemselben Zeichensatz vereint. Unicode enthält in einem einzigen Zeichensatz wohl alle Zeichen, die Sie je benötigen werden. Während das é immer noch durch den Zeichencode 233 repräsentiert wird, hat das kyrillische Zeichen щ nun den Zeichencode 1097.

1097 ist jedoch zu groß, als dass die Zahl mit nur einem Byte dargestellt werden kann.* Wenn man die Unicode-Zeichencodierung UTF-8 verwendet, wird das щ durch zwei Bytes repräsentiert. Der Zeichencode ist aber nicht einfach der Wert der beiden Bytes aneinandergereiht – eine etwas kompliziertere Codierung ist vonnöten.

Anderen Unicode-Zeichen entsprechen ein, zwei, drei oder vier Bytes in der UTF-8-Codierung.

Beachten Sie auch, dass der Buchstabe é in UTF-8 ebenfalls durch zwei Bytes repräsentiert wird, nicht durch ein einziges Byte wie in ISO 8859-1. (Nur die ASCII-Zeichen werden in UTF-8 durch ein einziges Byte codiert.)

UTF-8 ist die am weitesten gebräuchliche Möglichkeit, Unicode-Text auf Webseiten zu repräsentieren, und Sie sollten immer UTF-8 verwenden, wenn Sie Ihre Webseiten und Datenbanken erstellen. Aber prinzipiell ist UTF-8 nur eine der Möglichkeiten, Unicode-Zeichen zu codieren. Anders gesagt: Einem bestimmten Zeichencode im Unicode-Zeichensatz können verschiedene Byte-Sequenzen entsprechen, abhängig davon, welche Codierung für das Dokument verwendet wurde. Um Unicode-Zeichencodes durch Bytes zu repräsentieren, könnte jede der Codierungen UTF-8, UTF-16 oder UTF-32 verwendet werden. Das Devanagari-Zeichen mit dem Zeichencode 2325 (hexadezimal 915) wird bei Verwendung von UTF-16 durch zwei Bytes repräsentiert (09 15), bei UTF-8 durch drei Bytes (E0 A4 95) und bei UTF-32 durch vier Bytes (00 00 09 15).

Es können weitere Schwierigkeiten außer den in diesem Abschnitt beschriebenen auftreten (z.B. Byte-Reihenfolge und Escape-Sequenzen). Das hier beschriebene Detail zeigt jedoch, warum es wichtig ist, dass die Anwendung die richtige Zeichencodierung für die Daten kennt und weiß, wie damit umzugehen ist.