Schriftkodierung im Internet (Tutorium)Anleitung für die Verwendung von Nicht-ASCII-Zeichen im World Wide Web; von Jens Meyer Erstellt am So., 30.11.2003 Stand der Bearbeitung: Mi.,04.08.2009 Anm.: Dieses Anleitung zur Kodierung von Nicht-ASCII-Schriftzeichen auf Web-Seiten ist nicht fertig, sondern ein vorläufiger Zwischenstand eines fortgesetzten Arbeitsprozesses. Konstruktive Kritik ist dem Autor Jens Meyer unter Inhaltsverzeichnis
EinleitungDas Internet ist eine US-amerikanische Erfindung. Deswegen ist das einzige Schriftkodierungsverfahren, der zuverlässig in allen Diensten des Internet funktioniert, der "American Standard Code for Information Interchange" (ASCII; dt.: "Amerikanischer Standard-Code für den Informationsaustausch"). Deswegen sollten Web-Seiten (HTML-Dateien) ausschließ lich aus ASCII-Zeichen bestehen. Wer (zum Beispiel auf einer Website) Schriftzeichen verwenden möchte, die nicht zum ASCII gehören, sollte Vorkehrungen treffen, damit diese Schriftzeichen lesbar beim Empfänger eintreffen und nicht als Zeichenkauderwelsch. Wie man das macht, soll in diesem Tutorium erklärt werden. Der "American Standard Code for Information Interchange" (ASCII)
Das einzige Kodierungsverfahren für Schriftzeichen, das zuverlässig in allen Diensten und in allen Protokollen des Internet funktioniert, ist der "American Standard Code for Information Interchange" (ASCII). Deswegen sollten Web-Seiten (HTML-Dateien) ausschließlich aus ASCII-Zeichen bestehen. ASCII ist ein Schriftkodierungsverfahren (engl.: "Character Encoding Scheme"; CES; Schriftkodierungsschema). In einem Schriftkodierungsschema wird jedes Textzeichen (Buchstabe, Ziffer, Satzzeichen, ...) einem bestimmten Byte-Wert zugeordnet. Im ASCII wird zum Beispiel das große A dem Wert 0041 (Nr. 65) zugeordnet, das Ausrufungszeichen dem Wert 0021 (Nr. 33) und so weiter. Jedem Textzeichen ist also ein bestimmter Byte-Wert und damit eine Ordnungszahl eindeutig zugeordnet. Welche Zeichen der ASCII umfasst, ist der beigefügten ASCII-Tabelle zu entnehmen. Das Englische gehört (neben Latein) zu den sehr wenigen Sprachen weltweit, die mit den 26 Buchstaben des lateinischen Alphabets tatsächlich auskommen. In praktisch allen anderen Sprachen werden Sonderzeichen verwendet, zum Beispiel Akzente; in manchen auch besondere Buchstaben - ganz zu schweigen von Sprachen wie Griechisch, Russisch, Chinesisch, Japanisch, Koreanisch, Thailändisch, Arabisch, Hebräisch und so weiter, die nicht mit lateinischen Buchstaben geschrieben werden. Da der "American Standard Code for Information Interchange" jedoch, wie sein Name schon verrät, eine US-amerikanische Entwicklung ist, sind darin nur die Zeichen vorgesehen, die man zur Schreibung der englischen Sprache benötigt, nicht aber zum Beispiel die deutschen Umlaute oder das Esszett (ß), nicht die französischen Akzente und Ligaturen, von den vielen diakritischen Zeichen, die im Vietnamesischen verwendet werden, ganz zu schweigen. Diese Mängel des ASCII werfen einige Probleme auf, wenn man andere Sprachen als Englisch im Internet verwenden möchte. Wer sichergehen will, dass sein - zum Beispiel auf Deutsch verfasster - Text seine Adressaten in lesbarer Form und nicht als Zeichenkauderwelsch erreichen, muss alle nicht zum ASCII gehörenden Textzeichen in ASCII-Zeichen übersetzen (umkodieren). Dafür gibt es verschiedene Verfahren, die im Folgenden vorgestellt werden. Die Tasten auf einer typischen deutschen Computer-Tastatur stimmen nicht mit dem Zeichenvorrat des "American Standard Code for Information Interchange" (ASCII) überein. Eine deutsche Computertastatur enthält sowohl Zeichen, die nicht zum ASCII gehören, als auch - umgekehrt - einige Zeichen nicht, die zum ASCII dazugehören. Die deutsche Computertastatur hat also einerseits mehr, andererseits aber auch weniger Zeichen als der ASCII. Für folgende zum ASCII gehörende Zeichen gibt es auf einer deutschen Computertastatur keine Taste:ASCII-Zeichen Nr. 124 (senkrechter Strich, |, engl.: "Pipe", hexadezimal: |) fehlt auf einer typischen deutschen Tastatur. Das Zeichen auf der Taste mit den spitzwinkeligen Klammern unten links ist der (nicht zum ASCII gehörende) "broken vertical bar", also der durchbrochene senkrechte Strich (Zeichen-Nr. 166, ¦ hexadezimal: ¦), und nicht der "Pipe". ASCII-Zeichen Nr. 94 (Zirkumflex, ˆ hexadezimal: ^): Auf einer deutsche Tastatur befindet sich das Zirkumflex als "combining diacritical mark" (Unicode-Nr.770, hexadezimal: x0302); nicht das Zirkumflex als "spacing character" (Unicode-Nr. 94, hexadezimal x005E). Die Tilde im ASCII (ASCII-Zeichen Nr. 126) ist das Unicode-Zeichen "Tilde" mit der hexadezimalen Zeichen-Nummer x007E (entspricht der dezimalen Unicode-Zeichennummer 126; ~). Es handelt sich also um den "spacing character" Tilde und nicht um den "combining diacritical mark" Tilde ("COMBINING TILDE" mit der hexadezimalen Unicode-Zeichennummer x0303 bzw. der dezimalen Unicode-Zeichennummer 771). Bei dem Gravis-Akzent auf der Taste oben rechts auf der deutschen Tastatur (gleich neben der "Backspace"-Taste) handelt es sich um die "combining diacritical mark", nicht um den "spacing character" aus dem ASCII, also um das Zeichen mit der Unicode-Zeichennummer 768 (hexadezimal: 0300) und nicht um das Zeichen mit der ASCII-Zeichennummer 96 (hexadezimal: 0060). Deutsche Computertastatur (Keyboard-Layout für Deutsch)Vereinfachte Darstellung. Nicht-ASCII-Zeichen sind rot hervorgehoben
Folgende auf einer deutschen Computer-Tastatur vorhandenen Zeichen gehören nicht zum ASCII:Nach Unicode-Zeichennummer steigend geordnet
Folgende ASCII-Zeichen können auf einer deutschen Computertastatur nur mit Hilfe der "AltGr"-Taste erzeugt werden:
Der ASCII enthält folgende (vermeintlichen) diakritische Zeichen (Akzente etc.):
Der Akut-Akzent (frz.: "accent aigu"; engl.: "acute accent") gehört nicht zum ASCII. Er ist als "spacing character" unter der Zeichennummer 180 (hexadezimal: x00B4) im Unicode wie auch im ANSI-Zeichensatz zu finden; als "combining diacritical mark" hat der Akut im Unicode die Zeichennummer 769 (hexadezimal: x0301). Diese vermeintlichen diakritischen Zeichen im ASCII lassen sich nicht mit einem Buchstaben kombinieren, es handelt sich nicht um "combining diacritical marks", sondern um "spacing characters". Es ist also nicht möglich, zum Beispiel aus den ASCII-Zeichen Nr. 47 (Schrägstrich) und Nr. 79 (großes O) das große O mit Schrägstrich (Ø) zusammenzusetzen. Ebensowenig kann man zum Beispiel aus dem ASCII-Zeichen Nr. 126 (Tilde) und Nr. 110 (kleines n) das kleine n mit Tilde (ñ) zusammensetzen. Der ASCII eignet sich daher nur für lateinisch geschriebene Sprachen, die ohne diakritische Zeichen auskommen (wie Latein, Englisch, Niederländisch). Für Sprachen wie Französisch, Spanisch, Portugiesisch, Deutsch und so weiter reicht der Zeichenvorrat des ASCII nicht aus. HTML-EntitätenDer "American Standard Code for Information Intefchange" (ASCII) ist, wie gesagt, das einzige Schriftkodierungsverfahren, das zuverlässig in allen Internet-Protokollen, auch den älteren, funktioniert. Er enthält aber, wie dargelegt, nicht einmal annähernd alle benötigten Zeichen. Deswegen wurden Verfahren entwickelt, Nicht-ASCII-Zeichen in ASCII-Einheiten (so genannte Entitäten) umzuwandeln. Es gibt mehrere Möglichkeiten, Nicht-ASCII-Zeichen in Entitäten zu "übersetzen", die ausschließlich aus ASCII-Zeichen bestehen.
Das "World Wide Web Consortium" (W3C), ein Gremium, das für technische Standards und Normen im World Wide Web zuständig ist, hat für (fast) alle Sonderzeichen, die in den west-europäischen Sprachen verwendet werden, so genannte Entities festgelegt. Diese Entitäten dienen dazu, die Nicht-ASCII-Zeichen im Quelltext einer HTML-Datei so in ASCII-Zeichen umzukodieren, dass Web-Browser sie korrekt darstellen können.
Eine HTML-Entity wird immer von einem kaufmännischen Und (einem Ampersand; &) eingeleitet und durch ein Semikolon (;) abgeschlossen. Das Wort "größer" wird also mit Hilfe von HTML-Entities wie folgt kodiert: |
Zeichen | Unicode-Nr. | HTML-Maskierung | Beschreibung |
Ä | Ä | Ä | Großes A Umlaut (Diaeresis) |
ä | ä | ä | Kleines a Umlaut (Diaeresis) |
Ö | Ö | Ö | Großes O Umlaut (Diaeresis) |
ö | ö | ö | Kleines o Umlaut (Diaeresis) |
Ü | Ü | Ü | Großes U Umlaut (Diaeresis) |
ü | ü | ü | Kleines u Umlaut (Diaeresis) |
ß | ß | ß | Esszett, Ligatur aus s und z |
Hier findet man einige Übersichten darüber, welche Sonderzeichen in welchen Sprachen verwendet werden. Hier findet man eine Tabelle der vom W3C festgelegten HTML-Entities; alphabetisch nach dem Namen der Entity geordnet.
Es gibt für jedes druck- und darstellbare Zeichen des Unicode-Skripts "C1 Controls and Latin-1 Supplement" (das sind die Unicode-Zeichen Nr. 160 bis Nr. 255; hexadezimal: Hier findet man eine Tabelle des ANSI-Zeichensatzes. Vereinzelt sind auch HTML-Entities für Unicode-Zeichen aus anderen ("höheren") Unicode-Skripten festgelegt worden; aber bei Weitem nicht vollständig. Solange man eine Web-Seite also nur in einer (oder mehreren) west-europäischen Sprachen abfassen möchte, sind HTML-Entities eine sinnvolle Wahl für die Umkodierung der Nicht-ASCII-Zeichen in ASCII-Zeichen. Will man hingegen ost-europäische Sprachen verwenden oder gar solche, die nicht im lateinischen Alphabet geschrieben werden, kommt man mit HTML-Entities nicht weit. Dann muss man ein anderes Verfahren zur Umkodierung der Nicht-ASCII-Zeichen verwenden: Die im Folgenden beschriebenen Unicode-Entitäten. Unicode-EntitätenUnicode ist die landläufige Bezeichnung (und der eingetragene Markenname) für das "Universal Character Set" (USC; dt.: "Universeller Schriftzeichensatz"). Das universelle Zeichenkodierungsverfahren wird von den im Unicode Consortium (http://www.unicode.org) zusammengeschlossenen Computer-Unternehmen vereinbart und von der International Standardization Organization (ISO) genormt (in ISO/IEC 10646). Im Unterschied zu allen anderen Zeichenkodierungsverfahren (DOS-Zeichensatz, ASCII, ANSI-Zeichensatz, ISO-8859-Zeichensätze, EBCDIC und so weiter) ist das USC (zumindest seinem Anspruch nach) universell, das heißt: Alle Alphabete und Schriftzeichensysteme aller Sprachen und aller Zeiten der ganzen Welt können im USC kodiert werden - nicht nur das lateinische Alphabet, sondern zum Beispiel auch chinesische, japanische oder koreanische Schriftzeichen, keltische Runen, alt-ägyptische Hieroglyphen, mathematische und technische Symbole und so weiter. Darin besteht der riesig Vorteil der Verwendung von Unicode-Entitäten gegenüber der Verwendung von HTML-Entitäten: Während die HTML-Entitäten nicht einmal für alle Sprachen ausreichen, die im lateinischen Alphabet geschrieben werden, können mit Unicode-Entitäten ALLE Sprachen geschrieben werden, selbst so komplexe wie Chinesisch.
Natürlich reichen die 256 verschiedenen Kombinationen aus Nullen und Einsen, die innerhalb eines Bytes möglich sind, für die Kodierung all dieser vielen Schriftzeichen nicht aus; allein für Chinesisch benötigt man mehr als 20.000 Zeichen. Deswegen verwendet das "Universal Character Set" schon auf seiner untersten Ebene, der "Basic Multilingual Plane" (BMP; Dt. etwa: "Grundlegende, vielsprachige Ebene") jeweils zwei Byte zur Kodierung jedes Schriftzeichens. Zwei Byte bestehen zusammen aus 16 Bit, bieten also (2 hoch 16 gleich) 65.536 verschiedenen Kombinationsmöglichkeiten von Nullen und Einsen. Auf der "Basic Multilingual Plane" sind also 65.536 verschiedene Zeichen möglich. Dieser Zeichenvorrat reicht für alle gängigen lebenden Sprachen aus.
Im Unicode sind alle Textzeichen (Ziffern, Buchstaben, Ideogramme, Symbole, Satz- und Sonderzeichen) sozusagen fortlaufend durchnummeriert, so dass jedes Zeichen eine eindeutige Nummer (einen einmaligen Byte-Wert) hat. Diese Nummer ist abstrakt und daher schwer zu merken. Darin besteht der Nachteil bei der Verwendung von Unicode-Entitäten gegenüber der Verwendung von HTML-Entitäten - Während man sich ganz gut merken kann, dass die HTML-Entität für das Ä
Zum UCS-2 gehören auch mehrere Steuerzeichen, darunter das für die Schreibrichtung von rechts nach links (RIGHT-TO-LEFT MARK; Das "World Wide Web Consortium" (W3C) hat den Unicode in den Standard der "HyperText Markup Language" (HTML 4.0) aufgenommen. Theoretisch ist es relativ einfach, jedes beliebige Unicode-Zeichen in einem HTML-Dokument zu verwenden. Dazu schlägt man in den Unicode-Zeichentabellen nach, welchen Byte-Wert (= welchen Code-Punkt = welche laufende Nummer) das gewünschte Zeichen hat. Dann kann das betreffende Unicode-Zeichen als numerische Notation in den Quelltext der HTML-Datei eingefügt werden. Man gibt also (in einer bestimmten, festgelegten Schreibweise/ Syntax) die Nummer des Nicht-ASCII-Zeichens in den Quelltext der HTML-Datei ein und der Browser zeigt das betreffende Zeichen an - sofern er Unicode-fähig ist und in seinen Fonts die erforderliche Glyphe vorhanden ist (Näheres dazu unten im Kapitel "character" und "glyphe"). Es gibt zwei (gleichwertige) Möglichkeiten, die Zeichennummer als Unicode-Entität in den HTML-Quelltext zu setzen, nämlich in dezimaler und in hexadezimaler Schreibweise. Die korrekte Syntax für die dezimale Kodierung von Nicht-ASCII-Zeichen ist: &#[dezimale Zeichennummer];
Die dezimale Entität wird also eingeleitet durch das kaufmännische Und (&, Ampersand), dann folgt das Nummer-Zeichen (#; auch "Schweinegatter", "Raute", "mesh" oder "pound" genannt), dann die dezimale Zeichen-Nummer und zum Schluss das Semikolon (Strichpunkt). Die korrekte Syntax für die hexadezimale Kodierung von Nicht-ASCII-Zeichen in HTML lautet: &#x[hexadezimale Zeichennummer];
Die hexadezimale Entität wird also eingeleitet durch das kaufmännische Und (&), dann folgt das Nummer-Zeichen (#), dann ein kleines x, dann die hexadezimale Zeichen-Nummer und zum Schluss das Semikolon (;). Die hexadezimale Schreibweise wird also anhand des dem Zahlenwert vorangestellten "x" von der Dezimal-Schreibweise unterschieden. Will man zum Beispiel das Ä (A-Umlaut bzw. A Diaeresis) als Unicode-Entität kodieren, muss man wie folgt vorgehen:
Im Falle des A-Umlaut kann man anstelle der (hexadezimalen oder dezimalen) Unicode-Entität natürlich auch die HTML-Entität Zeichensatz-DeklarationEin möglicher Grund dafür, das korrekt kodierte Nicht-ASCII-Zeichen im Browser gleichwohl nicht korrekt angezeigt werden, kann in der fehlenden oder falschen Zeichensatzdeklaration im Kopf ("head") der HTML-Datei liegen.
Die Zeichensatz-Deklaration im "Head" der HTML-Datei für ISO 8859-1 ("Latin-1") lautet: Dadurch wird der Zeichensatz ISO-8859-1 festgelegt (das ist der normale Zeichensatz für westeuropäische Sprachen, unter anderem auch für Deutsch).
Die Zeichensatz-Deklaration im Kopf einer HTML-Seite für UFT-8 lautet: "UTF" steht für "USC Transformation Format" (Dt.: "UCS-Umformungsformat"). "UCS" steht dabei für "Universal Character Set" (Dt.: "Universeller Schriftzeichen-Satz"). In UCS-2 wird jedes Textzeichen mit zwei Byte (also in einem 16 Bit langen Datenwort) kodiert. In vielen gängigen Anwendungsprogrammen und Datenübertragungsprotokollen sind jedoch nur Zeichensätze vorgesehen, in denen jedes Schriftzeichen mit einem Byte (also acht Bit) kodiert ist. Daher ist das "Universal Character Set" mit vielen älteren, aber noch gebräuchlichen Programmen und Datenübertragungsverfahren unvereinbar. Deswegen wurden für die Code-Umsetzung zwischen Ein-Byte- und Zwei-Byte-Zeichensätzen mehrere "UCS Transformation Formats" (UTF; Dt.: "UCS-Umwandlungsformate") mit unterschiedlichen Eigenschaften für verschiedene Zwecke entwickelt. UTF-8 ist eines dieser Umwandlungsformate für das "Universal Character Set". UTF-8 wird im Internet viel eingesetzt. Die Ziffer 8 in "UTF-8" weist darauf hin, dass in diesem Kodierungsverfahren jedes Zeichen mit acht Bit dargestellt wird, während in UCS-2 jedes Zeichen mit 16 Bit kodiert wird. Die ersten 256 Zeichen in UCS-2 entsprechen dem "ISO Latin-1"-Zeichensatz (ISO 8859-1); da "Latin-1" allerdings nur 8 Bit pro Zeichen verwendet und UCS-2 16 Bit, werden bei den Unicode-Zeichen nicht benutzte Bit-Stellen durch Leerstellen aufgefüllt, die in "Latin-1" keinen Sinn ergeben und zu Zeichenkauderwelsch führen. So ist der Buchstabe A in ASCII in Hexadezimalschreibweise "41"; in UCS-2 wird das große A hingegen in Hexadezimalschreibweise als "0041" wiedergegeben. Durch Umkodierung mit Hilfe des Transformationsformats UTF-8 kann man die mit 16 Bit kodierten Unicode-Zeichen auch in einer 8 Bit-Umgebung verwenden. Durch die Transformation werden keine zusätzlichen ASCII-Zeichen erzeugt. UTF-8 ist im "Request For Comments" (RFC) Nr. 2279 beschrieben. Erlaubt sind daneben auch die Zeichensatzangaben, die unter der Web-Adresse http://www.iana.org/assignments/character-sets aufgeführt sind. "character" und "glyphe"
Selbst, wenn auf einer Web-Seite alle Nicht-ASCII-Zeichen korrekt als Unicode- oder als HTMl-Entitäten kodiert sind, zeigt der Browser unter Umständen Kästchen oder Fragezeichen anstelle der Sonderzeichen an. Dass eine Web-Browser "Unicode-fähig" ist, bedeutet nur, dass er das Doppel-Byte-Kodierverfahren grundsätzlich beherrscht; es bedeutet aber leider durchaus nicht, dass er auch alle darin kodierten Zeichen tatsächlich anzeigen kann. Unicode definiert zwar einen eindeutigen Byte-Wert für (nahezu) alle Textzeichen, löst jedoch nicht das Problem, wie alle diese Zeichen auf einem Computer dargestellt werden können. Unicode definiert nur Zeichenwerte und Eigenschaften von Zeichen, enthält aber keine Angaben darüber, wie das Zeichen zum Beispiel auf dem Bildschirm oder im Druck darzustellen ist. Herkömmliche Computer-Schriftarten (Fonts) reichen dazu nicht aus und neue Schriftarten, die wenigstens einen großen Teil der Unicode-Zeichen bereitstellen, verbreiten sich erst allmählich. Es genügt also nicht, dass ein Betriebssystem oder ein Anwendungsprogramm Unicode-konform ist, es muss auch über die erforderlichen Fonts verfügen, um die Unicode-Zeichen tatsächlich darzustellen. Links zum Thema Sonderzeichen und Unicode
Von Indrek Hein vom Eesti Keele Instituut - Institute of the Estonian Language. You can e.g. search for Unicode characters by name or code position, get lists of differences between some character sets, and get lists of characters needed for different languages. Sehr gute Einführung in die Sonderzeichen-Kodierung; auf Englisch. Mit weiterführenden Links.
Auf Deutsch.
Überblick über die verschiedenen Zeichensätze (Character Encoding Schemes)
W3C Working Draft; 30.April 2002
Nicht nur für Unix/ Linux von Interesse.
|