charsets - Zeichensatzstandards und Internationalisierung
Diese Handbuchseite gibt einen Überblick über verschiedene
Zeichensatzstandards und wie sie unter Linux verwandt wurden, bevor Unicode
allgegenwärtig wurde. Einige dieser Informationen können
für Benutzer, die noch auf Altsystemen und mit alten Dokumenten
arbeiten, nützlich sein.
Es werden Standards wie ASCII, GB 2312, ISO 8859, JIS, KOI8-R, KS und Unicode
diskutiert.
Der primäre Fokus liegt auf Zeichensätzen, die tatsächlich
durch lokale Zeichensätze verwandt wurden, nicht die Unzahl anderer,
die auf anderen Systemen gefunden werden können.
ASCII (American Standard Code For Information Interchange) ist der
ursprüngliche 7-bit-Zeichensatz, ursprünglich für
amerikanisches Englisch entwickelt. Auch als US-ASCII bekannt. Er wird derzeit
durch die Norm ISO/IEC 646:1991-12 IRV (Internationale Referenzversion)
beschrieben.
Es tauchten verschiedene ASCII-Varianten auf, die das Dollarzeichen durch andere
Währungszeichen ersetzten und die Zeichensatzzeichen mit alphabetischen
Zeichen jenseits des englischen ersetzten, um Deutsch, Französisch,
Spanisch und andere in 7-bit darzustellen. Alle sind veraltet; Glibc
unterstützt keine Locales, deren Zeichensätze nicht eine
wirkliche Obermenge von ASCII sind.
Da Unicode bei der Verwendung von UTF-8 ASCII-kompatibel ist, werden reine
ASCII-Dateien weiterhin auf modernen UTF-8-verwendenden Systemen korrekt
dargestellt.
ISO 8859 ist eine Serie von 15 8-bit-Zeichensätzen, bei allen denen ASCII
in ihrer niedrigen (7-bit-)Hälfte, unsichtbare Steuerzeichen in
Positionen 128 bis 159 und 96 Graphiken fester Breite in Positionen
160…255 enthalten sind.
Von diesen ist 8859-1 (»Lateinisches Alphabet Nr. 1« / Latin-1)
der Wichtigste. Es war breit akzeptiert und wurde von verschiedenen Systemen
unterstützt und wird allmählich durch Unicode ersetzt. Die
Zeichen aus ISO 8859-1 sind auch die ersten 256 Zeichen von Unicode.
Konsole-Unterstützung für andere 8859-Zeichensätze ist
unter Linux mittels Hilfswerkzeugen im Anwendungsraum (wie
setfont(8))
möglich, die die Tastaturanbindung und die EGA-Graphiktabelle
ändern und eine »Benutzer-Abbildung« der Schrifttabelle
im Konsolentreiber einsetzen.
Eine kurze Beschreibung jedes Zeichensatzes:
- 8859-1 (Latin-1)
- Latin-1 deckt die meisten Sprachen wie Albanisch, Baskisch,
Dänisch, Englisch, Färöisch, Galizisch,
Isländisch, Irisch, Italienisch, Norwegisch, Portugiesisch,
Spanisch und Schwedisch ab. Das Fehlen der niederländischen
Ligaturen IJ/ij, des französischen œ und der
altertümlichen „deutschen“ Anführungszeichen
wurde als tolerierbar betrachtet.
- 8859-2 (Latin-2)
- Latin-2 unterstützt viele zentral- und
osteuropäische Sprachen mit lateinischer Schrift wie Bosnisch,
Kroatisch, Tschechisch, Deutsch, Ungarisch, Polnisch, Slowakisch und
Slowenisch. Das Ersetzen der rumänischen ș/ț durch
ş/ţ wurde als tolerierbar betrachtet.
- 8859-3 (Latin-3)
- Latin-3 wurde zur Abdeckung von Esperanto, Maltesisch und
Türkisch entwickelt, aber 8859-9 löste es für
Türkisch später ab.
- 8859-4 (Latin-4)
- Latin-4 führte Buchstaben für
nordeuropäische Sprachen wie Estnisch, Lettisch und Litauisch ein,
aber 8859-10 und 8859-13 lösten es ab.
- 8859-5
- Kyrilische Buchstaben, die Bulgarisch, Belorussisch,
Mazedonisch, Russisch, Serbisch und (fast vollständig) Ukrainisch
unterstützen. Er wurde nie breit genutzt, siehe die nachfolgende
Diskussion von KOI8-R/KOI8-U.
- 8859-6
- Wurde für arabisch erstellt. 8859-6 ist eine
Bildzeichentabelle mit fester Schriftgröße separater
Buchstabenformen, aber eine korrekte Darstellungseinheit sollte sie unter
Verwendung der korrekten Anfangs-, Mittel- und Endformen kombinieren.
- 8859-7
- Wurde 1987 für modernes Griechisch erstellt und 2003
aktualisiert.
- 8859-8
- Unterstützt modernes Hebräisch ohne
Vokalisation (Satzzeichen). Vokalisation und vollständiges
biblisches Hebräisch waren außerhalb des Anwendungsbereichs
dieses Zeichensatzes.
- 8859-9 (Latin-5)
- Dies ist eine Variante von Latin-1, die isländische
Buchstaben durch türkische ersetzt.
- 8859-10 (Latin-6)
- Latin-6 fügte die Inuit-
(grönländischen) und die Sami- (lappischen) Buchstaben
hinzu, die Latin-4 fehlten, um den gesamten nordischen Raum
abzudecken.
- 8859-11
- Unterstützt das Thai-Alphabet und ist fast mit dem
Standard TIS-620 identisch.
- 8859-12
- Dieser Zeichensatz existiert nicht.
- 8859-13 (Latin-7)
- Unterstützt die Sprachen des Baltikums; insbesondere
enthält es lettische Zeichen, die nicht Teil von Latin-4 sind.
- 8859-14 (Latin-8)
- Dies ist der keltische Zeichensatz, der altes Irisch, die
keltische Mundart der Bewohner der Insel Man, Gälisch, Walisisch,
Kornisch und Bretonisch abdeckt.
- 8859-15 (Latin-9)
- Latin-9 ist dem breit benutzten Latin-1 ähnlich,
ersetzt aber einige weniger häufige Symbole durch das Euro-Zeichen
sowie französische und finnische Zeichen, die in Latin-1
fehlten.
- 8859-16 (Latin-10)
- Dieser Zeichensatz deckt viele
südosteuropäische Sprachen ab, insbesondere
unterstützt es Rumänisch vollständiger als
Latin-2.
KOI8-R ist ein nicht-ISO-Zeichensatz, der in Russland vor Unicode beliebt war.
Die untere Hälfte ist ASCII; die obere Hälfte ist der
kyrillische Zeichensatz, etwas besser als 8859-5 gestaltet. KOI8-U basiert auf
KOI8-R und hat bessere Unterstützung für ukrainisch. Keiner
dieser Sätze ist ISO-2022-kompatibel, anders als die ISO-8859-Serie.
Konsole-Unterstützung für KOI8-R ist unter Linux mittels
Hilfswerkzeugen im Anwendungsraum verfügbar, die die Tastaturanbindung
und die EGA-Graphiktabelle ändern und eine
»Benutzer-Abbildung« der Schrifttabelle im Konsolentreiber
einsetzen.
GB 2312 ist ein nationaler Zeichensatz von Kernland-China, der zum Ausdruck von
vereinfachtem Chinesisch verwandt wird. Genau wie bei JIS X 0208 werden
Zeichen in eine 94x94 Zwei-byte-Matrix zur Konstruktion von EUC-CN abgebildet.
EUC-CN ist die wichtigste Kodierung für Linux und enthält ASCII
und GB 2312. Beachten Sie, dass EUC-CN oft GB, GB 2312 oder CN-GB genannt
wird.
Big5 war ein in Taiwan beliebter Zeichensatz, um traditionelles Chinesisch
auszudrücken (Big5 ist sowohl ein Zeichensatz als auch eine Kodierung).
Es ist eine Obermenge von ASCII. Nicht-ASCII-Zeichen werden in zwei bytes
dargestellt. Bytes 0xa1…0xfe werden als führende Bytes
für Zwei-byte-Zeichen verwandt. Big5 und seine Erweiterungen wurde
breit in Taiwan und Hong Kong verwandt. Es ist nicht ISO-2022-konform.
JIS X 0208 ist ein japanischer nationaler Standardzeichensatz. Obwohl es noch
einige weitere japanische nationale Standardzeichensätze gibt (wie JIS
X 0201, JIS X 0212 und JIS X 0213) ist dies der wichtigste. Zeichen werden in
eine 94x94-Zwei-byte-Matrix abgebildet, wobei jedes Byte im Bereich
0x21…0x7e liegt. Beachten Sie, dass JIS X 0208 ein Zeichensatz und
keine Kodierung ist. Das bedeutet, das JIS X 0208 nicht selbst zum Wiedergeben
von Textdaten verwandt wird. JIS X 0208 wird als Komponente zur Konstruktion
von Kodierungen wie EUC-JP, Shift_JIS und ISO-2022-JP verwandt. EUC-JP ist die
wichtigste Kodierung für Linux und enthält ASCII und JIS X 0208.
In EUC-JP werden die Zeichen aus JIS X 0208 in zwei bytes ausgedrückt,
wobei jedes in dem Code JIS X 0208 plus 0x80 ist.
KS X 1001 ist ein koreanischer nationale Standardzeichensatz. Wie bei JIS X 0208
werden Zeichen in eine 94x94-Zwei-byte-Matrix abgebildet. KS X 1001 wird wie
JIS X 0208 verwandt, als Komponente, um Kodierungen wie EUC-KR, Johab und
ISO-2022-KR zu konstruieren. EUC-KR ist die wichtigste Kodierung für
Linux und enthält ASCII und KS X 1001. KS C 5601 ist ein älterer
Name für KS X 1001.
Die Normen ISO/IEC 2022 und 4873 beschreiben ein Schrift-Steuermodell, basierend
auf VT100-Vorgehen. Dieses Modell wird (teilweise) vom Linux-Kernel und
xterm(1) unterstützt. Mehrere ISO/IEC 2022-basierte
Zeichensätze wurden definiert, insbesondere für Japanisch.
Es gibt 4 graphische Zeichensätze, genannt G0, G1, G2 und G3, und einer
von ihnen ist der aktuelle Zeichensatz für Codes mit dem hohen Bit Null
(anfänglich G0), und einer von ihnen ist der aktuelle Zeichensatz
für Codes mit dem hohen Bit eins (anfänglich G1). Jeder
graphischer Zeichensatz hat 94 oder 96 Zeichen und ist im wesentlichen ein
7-bit-Zeichensatz. Er verwendet entweder die Codes 040…0177
(041…0176) oder 0240…0377 (0241…0376). G0 hat immer die
Größe 94 und verwendet die Codes 041…0176.
Das Umschalten zwischen den Zeichensätzen erfolgt über
Umschaltfunktionen
^N (SO oder LS1),
^O (SI oder LS0), ESC n
(LS2), ESC o (LS3), ESC N (SS2), ESC O (SS3), ESC ~ (LS1R), ESC } (LS2R), ESC
| (LS3R). Die Funktion LS
n macht Zeichensatz G
n zum aktuellen
für Codes mit dem hohen Bit null. Die Funktion LS
nR macht
Zeichensatz G
n zum aktuellen für Codes mit dem hohen Bit eins.
Die Funktion SS
n macht Zeichensatz G
n (
n=2 or 3) nur
für das nächste Zeichen zum aktuellen (unabhängig von dem
Wert seinen Bits hoher Ordnung).
Ein 94-Zeichen Satz wird durch eine Escape-Sequenz ESC ( xx (für G0), ESC
) xx (für G1), ESC * xx (für G2), ESC + xx (für G3)
bezeichnet, wobei xx ein im internationalen Register von kodierten
Zeichensätzen in ISO/IEC 2375 gefundenes Symbol oder ein Paar von
Symbolen ist. Beispielsweise wählt ESC ( @ den ISO-646-Zeichensatz als
G0, ESC ( A wählt den UK-Standardzeichensatz (mit Pfundzeichen statt
des Nummernzeichens), ESC ( B wählt ASCII (mit Dollarzeichen anstelle
des Währungszeichens), ESC ( M wählt einen Zeichensatz
für afrikanische Sprachen ESC ( ! A wählt den kubanischen
Zeichensatz und so weiter.
Ein 96-Zeichen Satz wird durch eine Escape-Sequenz xx (for G1), ESC . xx
(für G2) oder ESC / xx (für G3) als G
n-Zeichensatz
bezeichnet. Beispielsweise wählt ESC - G das hebräische Alphabet
als G1.
Ein Multibyte-Zeichensatz wird durch eine Escape-Sequenz ESC $ xx oder ESC $ (
xx (für G0), ESC $ ) xx (für G1), ESC $ * xx (für G2),
ESC $ + xx (für G3) als G
n-Zeichensatz bezeichnet.
Beispielsweise wählt ESC $ ( C den koreanischen Zeichensatz für
G0. Der als ESC $ B ausgewählte japanische Zeichensatz hat eine neuere
Version, die durch ESC & @ ESC $ B ausgewählt wird.
ISO/IEC 4873 schreibt eine engere Verwendung von Zeichensätzen vor, wobei
G0 fest (immer ASCII) ist, so dass G1, G2 und G3 nur für Codes mit
gesetztem Bit hoher Ordnung aufgerufen werden können. Insbesondere
werden
^N und
^O nicht mehr verwandt, ESC ( xx kann nur mit xx=B
verwandt werden und ESC ) xx, ESC * xx, ESC + xx sind äquivalent zu ESC
- xx, ESC . xx bzw. ESC / xx.
TIS-620 ist ein thailändischer nationaler Standardzeichensatz und eine
Obermenge von ASCII. In der gleichen Art wie bei der ISO-8859-Serie werden
thailändische Zeichen in 0xa1…0xfe abgebildet.
Unicode (ISO/IEC 10646) ist eine Norm, die auf die eindeutige Darstellung jedes
Zeichen in jeder menschlichen Sprache abzielt. Unicodes Struktur erlaubt 20,1
bits zur Kodierung jedes Zeichens. Da die meisten Computer keine
20,1-Ganzzahlen enthalten, wird Unicode normalerweise intern als
32-bit-Ganzzahl und entweder einer Reihe von 16-bit-Ganzzahlen (UTF-16)
(wofür nur zwei 16-bit-Ganzzahlen bei der Kodierung bestimmter seltener
Zeichen benötigt werden) oder einer Reihe von 8-bit-Bytes (UTF-8)
kodiert.
Linux stellt Unicode mittels des 8-bit-Unicode-Umwandlungsformats (UTF-8) dar.
UTF-8 ist eine Unicode-Kodierung variabler Länge. Sie verwendet 1 byte,
um 7 bits zu kodieren, 2 byte für 11 bits, 3 byte für 16 bit, 4
byte für 21 bit, 5 byte für 26 bit, 6 byte für 31 bit.
Im Folgenden steht 0,1,x für Null, Eins und ein beliebiges Bit. Ein Byte
0xxxxxxx steht für Unicode 00000000 0xxxxxxx, was das gleiche Symbol
wie ASCII 0xxxxxxx kodiert. Daher gelangt ASCII unverändert in UTF-8
und daher bemerken Benutzer, die nur ASCII verwenden, keine Änderung;
weder im Code noch in der Dateigröße.
Ein Byte 110xxxxx ist der Anfang eines 2-byte-Codes und 110xxxxx 10yyyyyy wird
in 00000xxx xxyyyyyy zusammengesetzt. Ein Byte 1110xxxx ist der Anfang eines
3-byte-Codes und 1110xxxx 10yyyyyy 10zzzzzz wird in xxxxyyyy yyzzzzzz
zusammengesetzt. (Wird UTF-8 zur Kodierung der 31-bit ISO/IEC 10646 verwandt,
dann geht diese Reihe bis zum 6-byte-Code).
Für die meisten Texte im ISO/IEC 8859-Zeichensatz bedeutet dies, dass die
Zeichen außerhalb von ASCII jetzt in zwei bytes kodiert werden. Dadurch
werden normale Textdateien nur um ein bis zwei Prozent
vergrößert. Für russische und griechische Texte werden
die Textdateien um 100% vergrößert, da der Text in diesen
Sprachen größtenteils außerhalb von ASCII ist. Für
japanische Benutzer bedeutet dies, dass die derzeit verbreiteten 16-bit-Codes
drei bytes belegen werden. Es gibt zwar algorithmische Umwandlungen aus
einigen Zeichensätzen (insbesondere ISO 8859-1) in Unicode, aber die
allgemeine Umwandlung benötigt den Einsatz von Umwandlungstabellen, die
für 16-bit-Codes recht groß werden können.
Beachten Sie, dass UTF-8 selbstsynchronisierend ist: 10xxxxxx ist der Rest und
jedes andere Byte ist der Kopf eines Codes. Beachten Sie, dass ASCII-Bytes in
einem UTF-8-Datenstrom nur als sie selbst vorkommen. Insbesondere gibt es
keine eingebetteten Nullbytes (»\0«) oder »/«, die
Teil eines größeren Codes bilden.
Da ASCII und insbesondere Nullbytes und »/« unverändert
sind, bemerkt der Kernel nicht, dass UTF-8 verwandt wird. Ihm ist es total
egal, wofür die Bytes stehen, mit denen er umgeht.
Die Darstellung von Unicode-Datenströmen erfolgt normalerweise
über »Teilschriftsatz«-Tabellen, die eine Teilmenge von
Unicode auf Schriftzeichen abbilden. Intern verwendet der Kernel Unicode, um
den im Video-RAM geladenen Unterschriftsatz zu beschreiben. Das bedeutet, dass
in der Linux-Konsole im UTF-8-Modus Zeichensätze mit 512 verschiedenen
Symbolen verwandt werden können. Das ist für Japanisch,
Chinesisch und Koreanisch nicht genug, aber es reicht für die meisten
anderen Zwecke.
iconv(1),
ascii(7),
iso_8859-1(7),
unicode(7),
utf-8(7)
Die deutsche Übersetzung dieser Handbuchseite wurde von Helge Kreutzmann
<
[email protected]> erstellt.
Diese Übersetzung ist Freie Dokumentation; lesen Sie die
GNU
General Public License Version 3 oder neuer bezüglich der
Copyright-Bedingungen. Es wird KEINE HAFTUNG übernommen.
Wenn Sie Fehler in der Übersetzung dieser Handbuchseite finden, schicken
Sie bitte eine E-Mail an die
Mailingliste
der Übersetzer