UTF-8(7) | Miscellaneous Information Manual | UTF-8(7) |
UTF-8 - eine ASCII-kompatible Multibyte-Unicode-Kodierung
Der Unicode-3.0-Zeichensatz ist durch 16-Bit-Wörter definiert. Die offensichtlichste Unicode-Kodierung (UCS-2) besteht aus einer Folge von 16-Bit-Zeichen. Solche Zeichenketten können – als Bestandteile vieler 16-Bit-Zeichen – Bytes wie »\0« oder »/« enthalten, die z. B. in Dateinamen und anderen Argumenten von C-Bibliotheksfunktionen eine besondere Bedeutung haben. Außerdem arbeiten die meisten UNIX-Programme mit ASCII-Dateien und können 16-Bit-Wörter nicht ohne größere Änderungen verarbeiten. Darum ist UCS-2 keine geeignete externe Kodierung von Unicode in Dateinamen, Text-Dateien, Umgebungsvariablen usw. Der ISO 10646 Universal Character Set (UCS), eine Erweiterung von Unicode, belegt sogar einen noch größeren Code-Raum – 31 Bit. Die offensichtliche UCS-4-Kodierung dafür (eine Folge von 32-Bit-Wörtern) leidet unter denselben Problemen wie die UCS-2-Kodierung.
Die UTF-8-Kodierung von Unicode und UCS hat diese Probleme nicht. Sie ist der gebräuchliche Anwendungsfall des Unicode-Zeichensatzes auf UNIX-artigen Betriebssystemen.
Die UTF-8-Kodierung hat die folgenden netten Eigenschaften:
Die folgenden Byte-Folgen werden für die Darstellung eines Zeichens verwendet. Die zu verwendende Folge hängt vom UCS-Code des Zeichens ab:
Die xxx-Bits werden durch den Code des Zeichens in Binärdarstellung ersetzt, mit dem höchstwertigsten Bit zuerst (Big Endian). Es wird die jeweils kürzeste Multibyte-Folge benutzt, die den Code des Zeichens darstellen kann.
Die UCS-Codewerte 0xd800…0xdfff (UTF-16-Ersatzzeichen) sowie 0xfffe und 0xffff (in UCS keinem Zeichen zugeordnet; UCS noncharacters) sollten nicht in standardkonformen UTF-8-Datenströmen enthalten sein. Gemäß RFC 3629 sollte kein Punkt oberhalb von U+10FFFF verwendet werden, wodurch Zeichen auf vier Byte beschränkt werden.
Das Unicode-Zeichen 0xa9 = 1010 1001 (das Copyright-Zeichen) wird in UTF-8 als
dargestellt und das Zeichen 0x2260 = 0010 0010 0110 0000 (das Ungleich-Symbol) als:
Anwender müssen, z.B. mit
eine UTF-8-Locale wählen, um die UTF-8-Unterstützung in Programmen zu aktivieren.
Anwendungs-Software, die auf den verwendeten Zeichensatz achten muss, sollte immer, z. B. mit
die Locale setzen und Programmierer anschließend den Ausdruck
auswerten, um festzustellen, ob eine UTF-8-Locale ausgewählt wurde und ob daher sämtliche Standard-Klartexteingaben und -ausgaben, Terminalkommunikation, Klartext-Dateiinhalte, Dateinamen und Umgebungsvariablen in UTF-8 kodiert sind.
An Einzel-Byte-Kodierungen gewöhnte Programmierer müssen daran denken, dass zwei bislang getroffene Annahmen in UTF-8-Locales nicht mehr gültig sind. Erstens bedeutet ein einziges Byte nicht mehr unbedingt ein einzelnes Zeichen. Zweitens, da moderne Terminal-Emulatoren im UTF-8-Modus auch chinesische, japanische und koreanische Zeichen doppelter Breite sowie Kombinationszeichen ohne horizontalen Vorschub unterstützen, setzt die Ausgabe eines einzelnen Zeichens nicht unbedingt den Cursor um eine Position weiter, wie es bei ASCII der Fall war. Heutzutage sollten Sie Bibliotheksfunktionen wie mbsrtowcs(3) und wcswidth(3) nutzen, um Zeichen und Cursorpositionen zählen.
Die offizielle Escape-Sequenz aus einem ISO-2022-Kodierungsschema (wie zum Beispiel von VT100-Terminals verwendet) nach UTF-8 ist ESC % G ("\x1b%G"). Die entsprechende Sequenz für die Rückkehr von UTF-8 zu ISO 2022 ist ESC % @ ("\x1b%@"). Andere ISO-2022-Sequenzen (wie zum Umschalten der G0- und G1-Sätze) sind im UTF-8-Modus nicht anwendbar.
Die Standards Unicode und UCS fordern, dass Erzeuger von UTF-8 die kürzeste mögliche Form liefern. Z. B. ist der Erzeugung einer Zwei-Byte-Sequenz mit dem ersten Byte 0xc0 nicht konform. Unicode 3.1 fordert, dass konforme Programme in ihrer Eingabe Formen, die nicht die kürzesten sind, nicht akzeptieren dürfen. Dies geschieht aus Sicherheitsgründen: Wenn Benutzereingaben auf mögliche Sicherheitsverletzungen überprüft werden, könnte ein Programm nur nach den ASCII-Versionen von "/../" oder ";" oder dem Nullbyte suchen und übersehen, dass es viele Möglichkeiten einer Nicht-ASCII-Darstellung neben der kürzesten UFT-8-Kodierung dieser Zeichen gibt.
ISO/IEC 10646-1:2000, Unicode 3.1, RFC 3629, Plan 9.
locale(1), nl_langinfo(3), setlocale(3), charsets(7), unicode(7)
Die deutsche Übersetzung dieser Handbuchseite wurde von Sebastian Rittau <srittau@jroger.in-berlin.de> und Martin Eberhard Schauer <Martin.E.Schauer@gmx.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.
10. Februar 2023 | Linux man-pages 6.03 |