Tips für Web-Profis (Designer & HTML-Autoren)
Zeichenkodierung Teil I
Zeichensatz und Kodierung
Um Texte im Internet zu verbreiten, muss die Schrift letzten Endes in digitale Signale übertragen werden. Schon sehr früh waren Computer in der Lage, mit den Buchstaben A bis Z (groß und klein), den Ziffern 0 bis 9 sowie einigen Satz- und Sonderzeichen umzugehen. Dazu hatte man einen Zeichensatz definiert. Ein Zeichensatz (engl. Character Set) ist einfach eine Liste mit den Zeichen, die der Computer darstellen können soll.
Dann hatte man noch definiert, durch welche Zahlenwerte jedes dieser Zeichen durch den Computer repräsentiert werden soll. Ein Computer kann ja nur mit (binären) Zahlen arbeiten. Daher muss dem Computer das Schreiben und Ausgeben von Zeichen per Programmierung beigebracht werden, bei der eine festgelegte Liste hinterlegt wird. Wenn der Computer dann einen Befehl erhält wie: „Zeichen Nummer 65 ausgeben!”, dann wird er z.B. den Buchstaben A ausgeben. Und Zeichen Nummer 66 ist vielleicht der Buchstabe B. Eine komplette Liste ist im Computer hinterlegt. Diese Zuordnung von Zeichen zu entsprechenden Zahlenwerten nennt man Zeichenkodierung (engl. Character Encoding).
Am Anfang war der ASCII-Standard
Je mehr Zeichen in den Zeichensatz aufgenommen werden, desto größer werden die Zahlenwerte, die man zu ihrer Kodierung braucht. Gerade in den Anfangszeiten der Computer musste noch um jedes Bit gefeilscht werden. Daher beschloss man, nur Zahlenwerte zu verwenden, die mit 7 Bit dargestellt werden können. Mit 7 Bit lassen sich exakt 128 verschiedene Werte darstellen.. (Für Mathe-Freunde: 27 = 128.)
Bereits in den 1960er Jahren etablierte sich unter dem Namen ASCII die bis heute populärste Zeichenkodierung für die ersten 128 Zeichen. Darin sind neben Zahlen, Buchstaben und Satzzeichen auch einige nicht lesbare Steuerzeichen enthalten.
Sind 128 Zeichen genug?
Technisch gesehen kann man mit einem 128 Zeichen langen Zeichensatz über die Runden kommen. Aber die Sprache ist ein zartes Pflänzlein und bestimmt (ist) unser Denken. Jede Abweichung führt unweigerlich zu Missverständnissen oder Kreativitätsverlust. Wer diese Ansicht nicht teilt der lese einfach: Korrekt dargestellte Texte sehen netter aus (Stilfrage) und lesen sich besser (Effizienzfrage).
Denkt man darüber nach, welche Zeichen im ASCII nicht repräsentiert sind, fallen einem zunächst die Umlaute und das scharfe S ein. Das wurde früher grob und schlecht gelöst in dem man den Leuten ein Ae für ein Ä und ein ss für ein ß vormachte. Ae ist nicht Ä (Aerodynamik) und ein Doppel-S ist kein scharfes S (Maße haben keine Masse). Sprachen sind unser Denken und Phlegmatismus führt unweigerlich zu Missverständnissen.
Selbst ein englischsprachiger Text kommt heute kaum mit dem Zeichensatz des ASCII aus: Währungssymbole sehen professioneller aus als Abkürzungen (£, ¥, €); ausländische Namen von Personen (Lech Wałęsa, Søren Kierkegaard), Städten (Haßfurt) und Firmen (Citroën) wollen richtig geschrieben werden; zu einem schönen Schriftbild gehören «diese» oder „jene” Anführungszeichen und man braucht vielleicht Zeichen wie das Copyright-Symbol (©).
Vom 129. bis zum 256. Zeichen
Schön, dass wir nicht nicht auf 128 Zeichen limitiert sind: Der Speicher unserer Computer werden in 8 Bit großen Einheiten angesprochen. Einen 8 Bit großen Datenblock nennt man ein Byte. Wie wir oben gelesen haben, belegt ASCII nur die durch 7 Bit darstellbaren 128 Werte (0 bis 127). Das 8. Bit hatte damals noch bei einigen Rechnern eine besondere Funktion; andere setzten es einfach immer 0. Es wäre Verschwendung, das 8. Bit weiterhin einfach zu nullen. Wenn wir alle 8 Bit der Bytes nutzen, kann jedes Byte 256 verschiedene Zahlenwerte (0 bis 255) darstellen. Also können wir unsere Umlaute, Akzente, Währungszeichen, Anführungszeichen, das scharfe S und weitere Sonderzeichen als Zahlenwert 128 bis 255 definieren.
So geschehen z.B. in den 1980er Jahren als Standard mit dem Namen ISO 8859‑1, auch Latin‑1 genannt. Dieser enthält praktisch alles, was man für die west-europäischen Sprachen braucht. Damals gab es noch keinen Euro und mithin kein Eurozeichen? Richtig. Das kam 1999 mit der Nachfolgeversion, genannt ISO 8859‑15 (Latin‑9). Bei ihr wurden ein paar weniger bedeutende Zeichen durch das Euro-Synbol € und ein paar bis dahin vermisste zusätzliche Buchstaben aus dem Französischen und Finnischen ersetzt.
Mehr passte aber auch nicht hinein. Für die gar lustigen Buchstaben unserer polnischen Nachbarn war kein Platz mehr in ISO 8859‑1. Aber zum Glück hatte man von Anfang an auch an die Ost-Europäer gedacht und ihrer Sprache ISO 8859‑2 (Latin‑2) gewidmet. Ähnliches für sonstige Sprachgruppen. Insgesamt gibt es unter ISO 8859 ganze 15 gültige Zeichenkodierungen. Damit sind praktisch alle Sprachen abgedeckt, die das lateinische Alphabet benutzen.
Es sei noch erwähnt, dass die ersten 128 Zeichen bei allen oben genannten Kodierungen gleich sind, nämlich so wie im ASCII definiert. Das hat sich im Rahmen der Kompatibilität auch bewährt.
Sind 256 Zeichen genug?
Leider reichen auch 256 Zeichen für die internationale Kommunikation nicht aus. Erstens gibt es multilinguale Dokumente und zweitens verbaut man sich mit einem so limitierten Zeichensatz viele Möglichkeiten:
- Es sollte dem Autor (z.B. am Content-Management-System) möglich sein, Zitate, auch aus anderen Sprachen, per copy/paste einzufügen, ohne dass Sonderzeichen oder fremdländiche Buchstaben verloren gehen und ohne dass man sich über den Zeichensatz (oder über HTML-Entitäten) Gedanken machen muss.
- Es ist ein Zeichen von Respekt, Namen aus anderen Sprachen korrekt wiederzugeben. Statt Lech Wałęsa einfach Walesa zu schreiben, ist nicht professionell und heute nicht mehr entschuldbar.
- Es gibt auch Sprachen jenseits des lateinischen Alphabets. Asiatische Sprachen kommen womöglich für sich alleine schon nicht mit 256 Zeichen aus.
- Wenn unterschiedlichste Sprachen in einem Dokument verwendet werden, kommen Zeichensätze mit einem Byte pro Zeichen immer an ihre Grenzen. Man findet z.B. im Internet durchaus, japanische Websites (Foren) mit englischen Zitaten oder deutschen Namen. Ruby-Programmierer können davon ein Lied singen.
- Für Maßeinheiten und Formeln braucht man eine Vielzahl von Symbolen und griechischen Zeichen, für die bei 256 Zeichen kein Platz ist.
Hier kommt Unicode ins Spiel. Es sprengt die Grenze von 256 Zeichen pro Zeichensatz, indem teilweise oder durchgängig mehrere Bytes zum Repräsentieren eines Zeichen verwendet werden. Das Resultat ist ein Zeichensatz mit vielen Tausenden von Zeichen. Das wird im zweiten Teil (Link s.u.) erkärt.
Zuvor sollte man ein paar Probleme verstehen, die allen Zeichenkodierungen gemeinsam sind:
Warum es im Web so viele Probleme mit Zeichensätzen gibt
Damit Zeichen richtig dargestellt werden, müssen folgende Bedingungen erfüllt sein:
- Der Konsument (z.B. die Browser- oder Email-Software) muss wissen, wie der Text kodiert ist.
- Der Konsument muss diese Kodierung umsetzen können.
Im Falle von Web-Browsern ist die zweite Bedingung meistens erfüllt. Nur passieren sehr oft folgende Fehler:
- In der Web-Seite ist keine Kodierung angegeben. Die meisten Webserver senden zwar eine Angabe zur Kodierung an den Browser, aber es wäre Zufall, wenn diese der wirklichen Kodierung der Datei (Seite) entspräche.
- In der Web-Seite ist eine falsche Kodierung angegeben. Die Datei ist zum Beispiel in Windows 1252 (Microsoft-Programme verwenden dieses proprietäre Format leider sehr gerne), aber der Autor ist der Meinung es handle sich um eine Standard-Kodierung wie Latin 1. Also gibt er im Head-Abschnitt der Datei (s.u.) „iso-8859-1” an und führt den Browser des Lesers in die Irre.
Daher hier der erste Tip zum Thema: Es muss sichergestellt sein, dass eine Seite Information über ihre Kodierung enthällt. Das kann der Server tun, wenn er entsprechend konfiguriert ist. Da wir den Server meist nicht selber konfigurieren und weil wir auf Nummer sicher gehen wollen, bietet sich ein HTTP-Header-Äquivalent für den Content-Type-Header an. Dazu schreibt man folgendes in den Head-Abschnitt der HTML-Datei. Die Syntax am Beispiel:
<meta http-equiv="Content-Type"
content="text/html; charset=iso-8859-1" />
Das soll allerdings nicht heißen, dass ich diesen Zeichensatz bzw. seine Kodierung empfehle. Ich halte sie für nicht mehr zeitgemäß, seitdem UTF-8 breite Unterstützung findet. Um Unicode im Allgemeinen und UTF-8 im Speziellen geht es im zweiten Teil.