Scroll to navigation

CHARSETS(7) Linux-Programmierhandbuch CHARSETS(7)

BEZEICHNUNG

charsets - Zeichensatzstandards und Internationalisierung

BESCHREIBUNG

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

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

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 westeuropäischen 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 / KOI8-U

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

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

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

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

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.

ISO 2022 und ISO 4873

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 LSn macht Zeichensatz Gn zum aktuellen für Codes mit dem hohen Bit null. Die Funktion LSnR macht Zeichensatz Gn zum aktuellen für Codes mit dem hohen Bit eins. Die Funktion SSn macht Zeichensatz Gn (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 Gn-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 Gn-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

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

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.

SIEHE AUCH

iconv(1), ascii(7), iso_8859-1(7), unicode(7), utf-8(7)

KOLOPHON

Diese Seite ist Teil der Veröffentlichung 5.10 des Projekts Linux-man-pages. Eine Beschreibung des Projekts, Informationen, wie Fehler gemeldet werden können, sowie die aktuelle Version dieser Seite finden sich unter https://www.kernel.org/doc/man-pages/.

ÜBERSETZUNG

Die deutsche Übersetzung dieser Handbuchseite wurde von Helge Kreutzmann <debian@helgefjell.de> 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.

13. August 2020 Linux