Unicode Transformation Format

Methode, Unicode-Zeichen auf Folgen von Bytes abzubilden

Ein Unicode Transformation Format, auch UCS Transformation Format, abgekürzt UTF, ist eine Methode, Unicode-Zeichen auf Folgen von Bytes abzubilden.

Für die Repräsentation der Unicode-Zeichen zum Zweck der elektronischen Datenverarbeitung gibt es verschiedene Transformationsformate. In jedem der Formate lassen sich alle im Unicode-Standard enthaltenen Zeichen (Codepoints) darstellen. Auch lässt sich jedes dieser Formate verlustfrei in eine andere UTF-Variante konvertieren.

Die verschiedenen Formate unterscheiden sich hinsichtlich ihres Platzbedarfs auf Speichermedien (Speichereffizienz), dem Kodierungs- und Dekodierungsaufwand (Laufzeitverhalten) sowie in ihrer Kompatibilität zu anderen (älteren) Kodierungsarten, zum Beispiel ASCII. Während beispielsweise einige Formate sehr effizienten Zugriff (wahlfreier Zugriff) auf einzelne Zeichen innerhalb der Zeichenkette erlauben, gehen andere sparsam mit Speicherplatz um. Daher ist bei der Auswahl eines bestimmten Unicode-Transformationsformats das für das vorgesehene Anwendungsgebiet geeignetste zu bestimmen.

UTF-8, UTF-16 und UTF-32

Bearbeiten
  • UTF-32 kodiert ein Zeichen immer in genau 32 Bit und ist damit am einfachsten, da keine variable Zeichenlänge benutzt wird und kein intelligenter Algorithmus benötigt wird, allerdings auf Kosten der Speichergröße – werden nur Zeichen des ASCII-Zeichensatzes verwendet, wird mehr als viermal so viel Speicherplatz benötigt wie bei einer Kodierung in ASCII (7 Bit benötigt). Je nach Abfolge der Bytes, ob zuerst das niederwertigste oder das höchstwertige Byte übertragen wird, spricht man von Little Endian (UTF-32LE) oder Big Endian (UTF-32BE).
  • UTF-16 ist das älteste Kodierungsverfahren, bei dem ein oder zwei 16-Bit-Einheiten (2 oder 4 Bytes) zur Kodierung eines Zeichens verwendet werden. Auch hier unterscheidet man je nach Abfolge der Bytes zwischen dem häufigeren UTF-16LE und UTF-16BE. Für Sprachen mit nicht-lateinischen Zeichen ist dies die platzsparende Variante, da sie üblicherweise mit 2 Byte auskommen.
  • UTF-8 kodiert Zeichen mit variabler Byte-Anzahl. Dabei wird ein Unicodezeichen in 1 bis 4 Bytes kodiert. Die Codepoints 0 bis 127, die dem ASCII-Zeichensatz entsprechen, werden in einem Byte kodiert, wobei das höchstwertige Bit stets 0 ist. Mithilfe des achten Bits kann ein längeres Unicode-Zeichen eingeleitet werden, das sich auf 2, 3 oder 4 Byte erstreckt. Damit wird bei auf dem lateinischen Alphabet basierenden Schriften am effizientesten mit dem Speicherplatz umgegangen.

Alle Standards können mit oder ohne eindeutiger Signatur zu Beginn, der Byte Order Mark (BOM), übertragen oder gespeichert werden. Vor allem bei der Bearbeitung von Dateien mit unterschiedlichen Programmen und auf unterschiedlichen Systemen hilft die BOM bei der richtigen Identifizierung. Ist alles vorher eindeutig definiert oder wird die Information anders übertragen (etwa durch die „charset“-Metainformation in einem HTML-Dokument), so wird die BOM weggelassen.

Beispiele

Bearbeiten

Als Beispiel der Ausdruck „Veränderung“ in verschiedenen Sprachen/Schriftsätzen und Kodierungen, wie in einem Hex-Editor.

Veränderung (de)
56 00 00 00|65 00 00 00|72 00 00 00|E4 00 00 00|6E 00 00 00|64 00 00 00    | UTF-32LE ↵
00 00 00 56|00 00 00 65|00 00 00 72|00 00 00 E4|00 00 00 6E|00 00 00 64    | UTF-32BE ↵
V          |e          |r          |ä          |n          |d              | Veränd  ↵
65 00 00 00|72 00 00 00|75 00 00 00|6E 00 00 00|67 00 00 00                | UTF-32LE
00 00 00 65|00 00 00 72|00 00 00 75|00 00 00 6E|00 00 00 67                | UTF-32BE
e          |r          |u          |n          |g                          | erung
56 00|65 00|72 00|E4 00|6E 00|64 00|65 00|72 00|75 00|6E 00|67 00          | UTF-16LE
00 56|00 65|00 72|00 E4|00 6E|00 64|00 65|00 72|00 75|00 6E|00 67          | UTF-16BE
V    |e    |r    |ä    |n    |d    |e    |r    |u    |n    |g              | Veränderung
56|65|72|C3 A4|6E|64|65|72|75|6E|67                                        | UTF-8
V |e |r |ä    |n |d |e |r |u |n |g                                         | Veränderung
Промена – Mazedonische Sprache mit kyrillischem Alphabet (mk)
1F 04 00 00|40 04 00 00|3E 04 00 00|3C 04 00 00 | UTF-32LE ↵
00 00 04 1F|00 00 04 40|00 00 04 3E|00 00 04 3C | UTF-32BE ↵
П          |р          |о          |м           | Пром    ↵
35 04 00 00|3D 04 00 00|30 04 00 00             | UTF-32LE
00 00 04 35|00 00 04 3D|00 00 04 30             | UTF-32BE
е          |н          |а                       | ена
1F 04|40 04|3E 04|3C 04|35 04|3D 04|30 04       | UTF-16LE
04 1F|04 40|04 3E|04 3C|04 35|04 3D|04 30       | UTF-16BE
П    |р    |о    |м    |е    |н    |а           | Промена
D0 9F|D1 80|D0 BE|D0 BC|D0 B5|D0 BD|D0 B0       | UTF-8
П    |р    |о    |м    |е    |н    |а           | Промена

Nepali wird in Devanagari geschrieben, einer Abugida. Eine Silbe entspricht einem Zeichen, wobei einige wenige Grundzeichen durch hinzufügen von Vokalzeichen modifiziert werden und andere Silben ergeben. (Ähnlich wie wir ein E mit einem Akut am Computer schreiben, nur dass dieser es in É umwandelt, ein eigenes Zeichen im Unicode. Die nepalesischen Zeichen sind jedoch auch im Unicode zusammengesetzt. Der Kreis ist ein Platzhalter für das Grundzeichen, mit dem diese Erweiterung reagiert.) Es handelt sich somit um zwei Zeichen, die ein oder zwei Mal modifiziert wurden. Dies im Gegensatz zum Chinesischen, wo es viele verschiedene Silbenschriftzeichen gibt. Modifizierende Unicode-Zeichen gibt es beispielsweise auch in der hebräischen Schrift.

चांजे – Nepali (ne)
1A 09 00 00|3E 09 00 00|02 09 00 00|1C 09 00 00|47 09 00 00  | UTF-32LE
00 00 09 1A|00 00 09 3E|00 00 09 02|00 00 09 1C|00 00 09 47  | UTF-32BE
च           ा           ं         |ज           े            | चांजे
1A 09|3E 09|02 09|1C 09|47 09                                | UTF-16LE
09 1A|09 3E|09 02|09 1C|09 47                                | UTF-16BE
च     ा    ं    |ज     े                                    | चांजे
E0 A4 9A|E0 A4 BE|E0 A4 82|E0 A4 9C|E0 A5 87                 | UTF-8
च        ा       ं       |ज        े                        | चांजे
变化 – Chinesische Sprachen (zh)
D8 53 00 00|16 53 00 00  | UTF-32LE
00 00 53 D8|00 00 53 16  | UTF-32BE
变         |化           | 变化
D8 53|16 53              | UTF-16LE
53 D8|53 16              | UTF-16BE
变   |化                 | zh:变化
E5 8F 98|E5 8C 96        | UTF-8
变      |化              | 变化

Andere Unicode-Kodierungen

Bearbeiten

Der Unicode-Standard definiert nur UTF-32, UTF-16 und UTF-8.[1] Darüber hinaus gibt es noch andere Kodierungen, welche ebenfalls alle Unicode-Zeichen kodieren können. Nachfolgend sind einige Beispiele aufgelistet.

UTF-1 war die erste 8-Bit-Kodierung für Unicode, konnte sich aber aufgrund mehrerer Schwächen nicht durchsetzen.

UTF-7 ist ein veraltetes Format, welches Unicode-Zeichen in druckbare ASCII-Zeichen (die jeweils nur die unteren 7 Bit eines Bytes benötigen, daher der Name des Formats) kodiert. Das Format war für die Übertragung von Unicode-Texten über 7-Bit-Kanäle gedacht (z. B. E-Mail oder Usenet), konnte sich allerdings nicht durchsetzen. Stattdessen wird für diesen Anwendungsfall meist UTF-8 kombiniert mit einem MIME-Transfer-Encoding wie Base 64 oder Quoted-printable verwendet, oder eben UTF-8 mit einem 8-Bit-Kanal.

Beispiel: Das Wort Übergröße wird in UTF-7 zu +ANw-bergr+APYA3w-e, was mit 19 Byte etwas kompakter ist, als die 24 Byte, die quoted-printable UTF-8 benötigt: =C3=9Cbergr=C3=B6=C3=9Fe.

UTF-EBCDIC

Bearbeiten

UTF-EBCDIC ist eine Unicode-Kodierung, die auf dem proprietären 8-Bit EBCDIC-Format von IBM-Großrechnern aufbaut, vergleichbar wie UTF-8 auf ASCII.

Es kodiert jedoch die ersten 160 Zeichen (65 Steuerzeichen und 95 graphischen Zeichen) in jeweils einem Byte an den bei EBCDIC üblichen Positionen, soweit existent, den restlichen Unicode-Vorrat analog zu UTF-8 in jeweils zwei bis fünf Bytes (bzw. bis sieben für Codepositionen, die schon mit UTF-16 nicht darstellbar sind, und daher wohl nie mit Zeichen belegt werden), an Positionen, die bei diversen EBCDIC-Codepages mit verschiedenen graphischen Zeichen belegt sind. Die BOM etwa wird zu (hexadezimal) DD 73 66 73 (einer vier-Byte-Sequenz). Dasselbe Zeichen wird dabei teilweise, je nach Codeposition, auch kürzer oder länger als bei UTF-8 codiert.

Es wurde mit dem Ziel entwickelt, die Verarbeitung von Unicode-Daten in existierenden Mainframe-Anwendungen zu erleichtern. In der Praxis wird UTF-EBCDIC auch auf Mainframes nur selten benutzt.

EBCDIC basierte Mainframe-Betriebssysteme wie z/OS benutzen in der Regel UTF-16. Beispielsweise wird UTF-16 von Komponenten wie DB2, COBOL, PL/I, Java und dem IBM XML Toolkit unterstützt.

UTF-5, UTF-6, UTF-9 und UTF-18

Bearbeiten

UTF-5 und UTF-6 waren Vorschläge zur Benutzung in Internationalen Domainnamen (IDN). Statt ihrer wurde jedoch Punycode standardisiert. UTF-9 und UTF-18 stellten einen Aprilscherz dar, sind prinzipiell auf Computern mit 9-bit-Bytes aber implementierbar.

Das Standard Compression Scheme for Unicode ist eine Kodierung, die vor allem auf einen kleinen Speicherbedarf ausgerichtet ist. Es können alle Unicode-Zeichen dargestellt werden, für die meisten Sprachen reicht dabei ein Byte pro Zeichen aus. Im Gegensatz zu anderen Kodierungen lässt sich ein Text auf viele verschiedene Arten kodieren. In der Praxis konnte sich SCSU aber nicht durchsetzen.

CESU-8 (kurz für Compatibility Encoding Scheme for UTF-16: 8-Bit) ist eine Variante von UTF-8. Der Codepoint wird zunächst in UTF-16 ausgedrückt, dann wird das Ergebnis in UTF-8 rekodiert, als wäre es UCS-2.

Die Zeichenkodierung GB18030 ist ebenfalls als Unicode Transformation Format anzusehen, da sie sämtliche Unicode-Codepoints abbilden kann. Sie wurde mit dem Ziel entworfen, kompatibel zu den Kodierungen GBK und GB2312 zu sein, welche sie ablösen soll.

Aufgrund dieser Kompatibilität ist die Kodierung deutlich aufwändiger als UTF-8, da die Kodierung nicht systematisch ist. Üblicherweise wird sie daher über Lookup-Tabellen implementiert. ASCII-Zeichen werden in einem Byte kodiert und entsprechen der normalen ASCII-Kodierung. Andere Zeichen werden in zwei oder vier Bytes kodiert, wobei in diesen Mehrbyte-Sequenzen – im Gegensatz zu UTF-8 – auch der Wertebereich der ASCII-Zeichen erneut mit genutzt wird.

Bearbeiten

Einzelnachweise

Bearbeiten
  1. Chapter 3.9 Unicode Encoding Forms. (PDF; 519 kB) unicode.org
  NODES
INTERN 1