Eine Übersicht über ASCII, ISO 8859, ANSI, Unicode und die Unicode-Kodierungen UTF-8, UTF-16 und UTF-32

Eine Zeichenkodierung (englisch „character encoding“) ist eine eindeutige Zuordnung von Schriftzeichen (BuchstabenZiffern und Symbole) zu einem Zahlenwert. Das ist notwendig, da Computer nur Zahlen speichern und übertragen können. Dabei existieren verschiedene sogenannte „Zeichensätze“ (englisch „encoding systems“), welche jeweils ihre eigenen Zuordnungen definieren. Der deutsche Umlaut „Ü“ wird zum Beispiel im ISO-8859-1-Zeichensatz (auch „Latin-1“ genannt) mit dem Dezimalwert „220“ kodiert. In einem anderen Zeichensatz kann der Wert Ü einer anderen Dezimalzahl zugeordnet sein. Zur richtigen Darstellung eines Zeichens muss also der Zahlenwert und der Zeichensatz bekannt sein. In diesem Artikel stelle ich dir die am häufigsten verwendeten Zeichensätze vor.

ASCII (oft auch "US-ASCII" genannt)

ASCII wurde 1963 zum ersten mal publiziert und bildet die Grundlage für fast alle moderneren Zeichensätze.

ASCII wurde so konzipiert, dass all seine Zeichen mit 7bit (128 mögliche Zeichen) dargestellt werden können. ASCII’s 128 Zeichen bestehen aus 33 nicht druckbaren sowie 95 druckbaren Zeichen.

Die ersten 32 ASCII-Zeichencodes (von 0x00 bis 0x1F)  und der Letzte (0xFF) sind für Steuerzeichen (control characters) reserviert. Diese Zeichen stellen keine Schriftzeichen dar, sondern dienen (oder dienten) zur Steuerung von solchen Geräten, die den ASCII Zeichensatz verwenden (etwa Drucker). Steuerzeichen sind beispielsweise der Wagenrücklauf für den Zeilenumbruch oder Bell (die Glocke). Die meisten nicht druckbaren Zeichen haben heute keine grosse Relevanz mehr.

Die druckbaren Zeichen umfassen das lateinische Alphabet in Gross- und Kleinschreibung, die zehn arabischen Ziffern sowie einige Interpunktionszeichen.

ASCII-Zeichentabelle: Gelb unterlegte Zeichen sind nicht druckbare Zeichen
ASCII-Zeichentabelle (Codes 0 - 31 und Code 127 kodieren nicht druckbare Zeichen)

ISO 8859 Familie mit seinen 15 Teilnormen

Während die 95 druckbaren Zeichen von ASCII genug waren, um Information in englischer Sprache auszutauschen, brauchten andere Sprachen wie Deutsch, Französisch oder Russisch mehr Zeichen, welche mit ASCII noch nicht mitgeliefert wurden. Daher wurde im Jahr 1987 die ISO 8859 Familie eingeführt, welche neu ein 8-tes bit für die Zeichencodierung verwendete und somit platz für weitere 128 Zeichen bot. Die ISO 8859 Familie definiert 15 verschiedene Zeichensätze für 15 verschiedene Sprachregionen.

ISO 8859     -1Latin-1, Westeuropäisch
ISO 8859     -2Latin-2, Mitteleuropäisch
ISO 8859     -3Latin-3, Südeuropäisch
ISO 8859     -4Latin-4, Nordeuropäisch
ISO 8859     -5Kyrillisch
ISO 8859     -6Arabisch
ISO 8859     -7Griechisch
ISO 8859     -8Hebräisch
ISO 8859     -9Latin-5, Türkisch
ISO 8859     -10Latin-6, Nordisch
ISO 8859     -11Thai
ISO 8859     -12(existiert nicht)
ISO 8859     -13Latin-7, Baltisch
ISO 8859     -14Latin-8, Keltisch
ISO 8859     -15Latin-9, Westeuropäisch
ISO 8859     -16Latin-10, Südosteuropäisch

Aufbau des ISO 8859 Zeichensatzes

  • ISO 8859 ist so aufgebaut, dass es kompatibel zu ASCII ist. Das heisst, die ersten 128 Zeichen sind bei jeder Teilnorm genau dieselben wie bei ASCII.
  • Die Zeichen 7F (128) bis 9F (159) werden in der Norm nicht definiert und können je nach Verwendung als Codes für Steuerzeichen eingesetzt werden.
  • Die letzten 96 Positionen A0 (160) bis FF (255) enthalten regionale Sonderzeichen und machen den Unterschied zwischen den Teilnormen aus. Einmal sind es Buchstaben für das Deutsche wie z.B. Umlaute wie Ö, Ü, Ä, in anderen Teilnorm sind es z.B. arabische, kyrillische oder thailändische Zeichen.

Das folgende Bild zeigt die ISO 8859 Tabelle der Teilnorm 1 (Westeuropäisch), oft auch „Latin-1“ genannt.

Tabelle für ISO 8859 mit der Teilnorm 1 ( Latin-1, Westeuropäisch)

Windows-1252 (oft auch "ANSI" genannt)

Windows-1252 auch CodePage-1252 oder ANSI genannt. ist eine 8-Bit-Zeichenkodierung, die für das Betriebssystem Microsoft Windows entwickelt wurde. Der Zeichensatz basiert auf ISO 8859-1 (Latin-1, Westeuropäisch), weicht aber im Bereich 80 (128) – 9F (159) von dieser ab. Statt des nicht definierten Bereiches für Steuerzeichen, beinhalten diese 32 Positionen hier 27 darstellbare Zeichen, u. a. die in ISO 8859-15 hinzugekommenen und einige für bessere Typografie notwendige Zeichen.

Manche Applikationen vermischen die Definition von ISO 8859-1(Latin-1, Westeuropäisch) und Windows-1252. Da beispielsweise in HTML die zusätzlichen Steuerzeichen aus ISO 8859-1 keine Bedeutung haben, werden oft die druckbaren Zeichen aus Windows-1252 verwendet. Aus diesem Grund schreibt der neue HTML5-Standard vor, dass als ISO 8859-1 markierte Texte als Windows-1252 zu interpretieren sind. Zum Teil wird für Windows-1252 fälschlicherweise auch der name „Latin-1“ verwendet, welcher eigentlich nur für ISO 8859-1 verwendet werden sollte.

Windows definierte nebst dem Windows-1252 Zeichensatz noch weitere Zeichensätze für Windows. Diese basieren aber nicht immer auf der ISO 8859 Familie.

Alle basieren aber auf dem ursprünglichen ASCII Zeichensatz und sind in den ersten 128 Zeichen deckungsgleich mit ASCII (mit einer kleinen Ausnahme in Codepage 932 (Japanisch) und Codepage 949 (Koreanisch) wo  an Stelle des Backslashes „\“ an Codepunkt 0x5C zum Teil das Yen-Zeichen (¥) oder das Wonzeichen () dargestellt wird).

Untenstehend eine kurze Übersicht über die restlichen Windows-Codepages und deren Kompatiblität zur ISO 8859 Familie:

Codepage 874

Thai

Sie basiert auf und ist aufwärtskompatibel zu ISO 8859-11 (Thai), enthält aber außerdem die typografischen Zeichen von Windows-1252 sowie das Eurozeichen.

Codepage 932

Japanisch

Da es keine ISO 8859 Entsprechung für Japanisch gibt, ist Codepage 932 auch nicht kompatibel zur ISO 8859 Familie. Codepage 932 ist eine variable 16-Bit-Kodierung, d. h. ein Zeichen kann entweder ein oder zwei Byte groß sein.

Codepage 936

Vereinfachtes Chinesisch

Da es keine ISO 8859 Entsprechung für Vereinfachtes Chinesisch gibt, ist Codepage 936 auch nicht kompatibel zur ISO 8859 Familie. Codepage 936 ist eine variable 16-Bit-Kodierung, d. h. ein Zeichen kann entweder ein oder zwei Byte groß sein.

Codepage 949

Koreanisch

Da es keine ISO 8859 Entsprechung für Koreanisch gibt, ist Codepage 949 auch nicht kompatibel zur ISO 8859 Familie. Codepage 949 ist eine variable 16-Bit-Kodierung, d. h. ein Zeichen kann entweder ein oder zwei Byte groß sein.

Codepage 950

Traditionelles Chinesisch

Da es keine ISO 8859 Entsprechung für Traditionelles Chinesisch gibt, ist Codepage 950 auch nicht kompatibel zur ISO 8859 Familie. Codepage 950 wäre gemäss Definition ein 16-bit Zeichensatz. Inoffiziell werden die Bytes, bei denen das oberste Bit nicht gesetzt ist (0x00 bis 0x7F) als ASCII-Zeichen interpretiert. Dadurch haben Zeichen in Codepage 950 in der Praxis eine variable Länge von 1 oder 2 Byte.

Codepage 1250

Mitteleuropäisch

Sie basiert auf und ist aufwärtskompatibel zu ISO 8859-2 (Latin-2, Mitteleuropäisch).  Wie in Windows-1252 wurden bei Windows-1250 die Steuerzeichen aus der ISO 8859 Familie durch typografische Satzzeichen und zusätzliche Buchstaben ersetzt

Codepage 1251

Kyrillisch

Codepage 1251 ist nicht aufwärtskompatibel zu ISO 8859-5 (Kyrillisch).

Codepage 1253

Griechisch

Codepage 1253 nicht aufwärtskompatibel zu ISO 8859-7 (Griechisch), da unter anderem der Buchstabe Ά und das €-Symbol an einer anderen Stelle kodiert sind.

Codepage 1254

Türkisch

Sie basiert auf und ist aufwärtskompatibel zu ISO 8859-9 (Latin-5, Türkisch). Wie in Windows-1252 wurden bei Windows-1254 die Steuerzeichen aus der ISO 8859 Familie durch typografische Satzzeichen und zusätzliche Buchstaben ersetzt

Codepage 1255

Hebräisch

Codepage 1255 ist inkompatibel zu ISO 8859-8 (Hebräisch),  deckt aber in Gegensatz zu diesem außer Hebräisch auch Jiddisch ab und enthält auch alle Vokalzeichen.

Codepage 1256

Arabisch

Codepage 1256 ist inkompatibel zu ISO 8859-6 (Arabisch), deckt im Gegensatz zu ISO 8859-6 aber Arabisch, Persisch und Urdu vollständig ab und enthält auch alle Vokalzeichen.

Codepage 1257

Baltisch

Codepage 1257 ist inkompatibel zu ISO 8859-13 (Latin-7, Baltisch), da sie sich in ein paar wenigen Zeichen unterscheiden.

Codepage 1258

Vietnamesisch

Da es keine ISO 8859 Entsprechung für Vietnamesisch gibt, ist Codepage 1258 auch nicht kompatibel zur ISO 8859 Familie.

Nun hatte jede Sprachregion ihr eigener Zeichensatz. Das hat gut funktioniert, solange die Dokumente die eigene Sprachregion nicht verlassen hatten. Schon bald wurde aber das Internet für die breiten Massen verfügbar und die Menschen begannen, ihre digitalen Dokumente mit der ganzen Welt zu teilen. Das Chaos war perfekt! Oft ist beim Empfänger dann noch so etwas angekommen:

�����[ Éf����Õì ÔǵÇ���¢!!

Nun musste ein neuer Zeichensatz her, welcher auf der ganzen Welt verwendet werden konnte. Das war die Geburtsstunde von Unicode!

Unicode

Unicode ist eigentlich nichts anderers als ein weiterer Zeichensatz, welcher jedem Zeichen einen Zahlenwert (Code) zuordnet, jedoch mit der Absicht dies langfristig für jedes Sinn tragende Schriftzeichen oder Textelement aller bekannten Schriftkulturen und Zeichensysteme zu tun. Ziel ist es, die Verwendung unterschiedlicher und inkompatibler Kodierungen in verschiedenen Ländern oder Kulturkreisen zu beseitigen.

Aufbau von Unicode

Der gesamte vom Unicode-Standard beschriebene Bereich umfasst aktuell 1.114.112 Codepunkte. Der Zeichenumfang  ist in 17 Ebenen (englisch planes) gegliedert, welche jeweils 216 = 65.536 Zeichen umfassen. Sechs dieser Ebenen werden bereits verwendet, die restlichen sind für spätere Nutzung reserviert.

  • Die Basic Multilingual Plane (BMP; deutsch Mehrsprachige Basis-Ebene, auch als Plane 0 bezeichnet) enthält hauptsächlich Schriftsysteme, die aktuell in Gebrauch sind. Der Block ist stark fragmentiert und weitgehend belegt, sodass neu zu codierende Schriftsysteme hier keinen Platz mehr finden. Der grösste Teil der Heutzutage benutzten Zeichen befinden sich also auf dieser Basis-Ebene. Die folgende Grafik zeigt grob auf, was die BMP alles codiert:

     

  • Die Supplementary Multilingual Plane (SMP; dt. Ergänzende mehrsprachige Ebene, auch als Plane 1 bezeichnet) wurde mit Unicode 3.1 eingeführt. Sie enthält vor allem historische Schriftsysteme, aber auch größere Ansammlungen an Zeichen, die selten in Gebrauch sind, wie z. B. Domino– und Mah-Jonggsteine und Emoji. Mittlerweile werden auch Schriftsysteme in der SMP codiert, die noch in Benutzung sind, aber in der BMP keinen Platz mehr finden.
  • Die Supplementary Ideographic Plane (SIP; dt. Ergänzende ideographische Ebene, auch als Plane 2 bezeichnet), die ebenfalls mit Unicode 3.1 eingeführt wurde, enthält ausschließlich CJK-Schriftzeichen, die selten benutzt werden, dazu zählen unter anderem auch die Chữ Nôm, die früher in Vietnam benutzt wurden. Sollte diese Ebene dafür nicht ausreichen, ist Plane 3 für weitere CJK-Schriftzeichen reserviert.
  • Die Supplementary Special-purpose Plane (SSP; dt. Ergänzende Ebene für spezielle Verwendungen, auch als Plane 14 bezeichnet) enthält einige wenige Kontrollzeichen zur Sprachmarkierung.
  • Die letzten beiden Ebenen, jeweils Supplementary Private Use Area-A und -B (PUA; auch Plane 15 und Plane 16), stehen als privat nutzbare Bereiche (PUA) zur Verfügung. Sie werden teilweise auch als Private Use Planes (PUP) bezeichnet

Um einen Unicode Zahlenwert darzustellen, wird die Zeichenfolge „U+“ und dann eine Zahl im Hexadezimalsystem angehängt. Meistes werden mindestens 4 Hexadezimalstellen dargestellt auch wenn die Zahl weniger als 4 Hexstellen benötigt, z.B. „U+0045„. Die ersten vier Zahlen von rechts definieren die Zahl innerhalb einer Ebene (Plane), die fünfte und sechste Stelle sagen aus, in welcher Plane man sich befindet:

Plane 0: U+ 00 0000 bis U+ 00 FFFF (65.536 mögliche Zeichen)
Plane 1: U+ 01 0000 bis U+ 01 FFFF(65.536 mögliche Zeichen)
Plane 2: U+ 02 0000 bis U+ 02 FFFF (65.536 mögliche Zeichen)

Plane 16: U+ 0F 0000 bis U+ 0F FFFF (65.536 mögliche Zeichen)
Plane 17: U+ 10 0000 bis U+ 10 FFFF(65.536 mögliche Zeichen)

Kompatiblität zu älteren Zeichenkodierungen

Die ersten 256 codierten Zeichen des Unicode-Zeichensatzes sind identisch mit den Zeichen aus ISO 8859-1 (Latin-1, Westeuropäisch). Somit ist ISO 8859-1 ein Subset von Unicode und somit ist auch ASCII ein Subset von Unicode, da ASCII ein Subset von ISO 8859-1 ist.

Dies gilt aber nicht für den Windows-1252 (ANSI) Zeichensatz, welcher seinerseits eine Erweiterung von ISO8859-1 ist. Hier weichen die zusätzlich eingeführten Zeichen im Bereich des nicht definierten Bereichs für Steuerzeichen von ISO 8859-1 von Unicode ab. Diese werden in Unicode unter einer anderen Position codiert. Die nachfolgende Tabelle zeigt, wo diese Zeichen in Unicode untergebracht wurden:

Surrogate

2048 Codepunkte im Bereich U+D800 bis U+DFFF werden als Teile von Surrogate-Paaren im Kodierungsschema UTF-16 zur Darstellung von Codepunkten oberhalb der BMP (also im Bereich U+10000 … U+10FFFF) verwendet und stehen deshalb nicht selbst als Codepunkt für einzelne Zeichen zur Verfügung. Siehe dazu mehr zum Thema UTF-16 weiter unten.

Unicode Transformation Formate

Der Job von Unicode besteht nur darin, jedem Zeichen einen Zahlenwert (Code) zuzuordnen. Es sagt nichts darüber aus, wie und mit wievielen Bytes diese Zahlenwerte dann im Computer gespeichert werden sollen.

Unicode-Zahlenwerte auf Folgen von Bytes abzubilden ist die Aufgabe des sogenannten „Unicode Transformation Format“ kurz „UTF“. Dabei wurden mehrere solcher UTF’s entwickelt. In jedem der UTF-Formate lassen sich alle 1.114.112 im Unicode-Standard enthaltenen Zeichen (Codepoints) darstellen. Auch lässt sich jedes dieser Formate verlustfrei in eine andere UTF-Variante konvertieren.

Der Unicode-Standard definiert die drei UTF-Formate UTF-32, UTF-16 und UTF-8. Diese haben sich in der Praxis durchgesetzt. Darüber hinaus gibt es noch weitere UTF Varianten welche ebenfalls auf elegante Weise alle Unicode-Zeichen kodieren können. Diese haben in der Praxis aber keine grosse Verbreitung erfahren und ich werde auch nicht tiefer auf sie eingehen.

UTF-8

UTF-8 ist die am weitesten verbreitete Kodierung für Unicode-Zeichen. UTF-8 ist in den ersten 128 Zeichen (Indizes 0–127) deckungsgleich mit ASCII. Alle ASCII Zeichen lassen sich in UTF-8 mit nur einem Byte Speicherbedarf abspeichern. Alle nicht ASCII Zeichen benötigen aber zwei oder mehr Bytes. Bereits die deutschen Umlaute erfordern zwei Bytes, ebenso griechische oder kyrillische Zeichen. Zeichen fernöstlicher Sprachen und von Sprachen aus dem afrikanischen Raum belegen dagegen bis zu 4 Byte je Zeichen.

Daher ist UTF-8 für Texte die mehrheitlich in der englischen Sprache geschrieben werden sehr Speicherschonend und lassen sich im Regelfall ohne Modifikation sogar mit nicht-UTF-8-fähigen Texteditoren ohne Beeinträchtigung bearbeiten, was einen der Gründe für den Status als De-facto-Standard-Zeichenkodierung des Internets und damit verbundener Dokumenttypen darstellt. Im Oktober 2017 verwendeten 89,9 % aller Websites UTF-8.

Aufbau von UTF-8

Unicode-Zeichen mit Werten aus dem Bereich von 0 bis 127 (0 bis 7F hexadezimal) werden in der UTF-8-Kodierung als ein Byte mit dem gleichen Wert wiedergegeben. Daher sind alle Daten, für die ausschließlich echte ASCII-Zeichen verwendet werden, in beiden Darstellungen identisch.

Unicode-Zeichen größer als 127 werden in der UTF-8-Kodierung zu Byteketten der Länge zwei bis vier kodiert.

Das erste Byte eines UTF-8-kodierten Zeichens nennt man dabei Start-Byte, weitere Bytes heißen Folge-Bytes. Start-Bytes beginnen also immer mit 0 oder 11, Folge-Bytes immer mit 10.

Ist das höchste Bit des ersten Bytes 0, handelt es sich um ein ASCII-Zeichen und ist somit ein Ein-Byte Zeichen ohne Folge-Bytes. Sind die höchsten beiden Bits eines Bytes 11, handelt es sich um das Startbyte eines Mehrbytezeichens, sind sie 10, um ein Folgebyte eines Mehrbytezeichens.

Bei den Startbytes von Mehrbyte-Zeichen gibt die Anzahl der höchsten 1-Bits die gesamte Bytezahl des als Mehrbyte-Zeichen kodierten Unicode-Zeichens an. Anders interpretiert, die Anzahl der 1-Bits links des höchsten 0-Bits entspricht der Anzahl an Folgebytes plus eins, z. B. 1110xxxx 10xxxxxx 10xxxxxx = drei Bits vor dem höchsten 0-Bit = drei Bytes insgesamt, ein Start-Byte und zwei Folgebytes.

Startbytes (0… oder 11…) und Folgebytes (10…) lassen sich eindeutig voneinander unterscheiden. Somit kann ein Bytestrom auch in der Mitte gelesen werden, ohne dass es Probleme mit der Dekodierung gibt, was insbesondere bei der Wiederherstellung defekter Daten wichtig ist. Bytes beginnend mit 10 werden einfach übersprungen, bis 0… oder 11… erkannt wird. Dass Startbytes und Folgebytes eindeutig voneinander unterschieden sind, ist ein Vorteil der UTF-8-Kodierung. Bei Kodierungen ohne diese Eigenschaft ist das Lesen eines Datenstroms, dessen Beginn unbekannt ist, unter Umständen nicht möglich

Zu beachten:

  • Das gleiche Zeichen kann theoretisch auf unterschiedliche Weise kodiert werden (Zum Beispiel „a“ als 01100001 oder fälschlich als 11000001 10100001). Jedoch ist nur die jeweils kürzestmögliche Kodierung erlaubt.
  • Bei mehreren Bytes für ein Zeichen werden die Bits bündig angeordnet – das niedrigste Bit (least significant bit) des Unicode-Zeichens steht also immer im niedrigsten Bit des letzten Folge-Bytes.
  • Ursprünglich gab es auch Kodierungen mit mehr als vier Oktetten (bis zu sechs), diese sind jedoch ausgeschlossen worden, da es in Unicode keine korrespondierenden Zeichen gibt und UTF-8 in seinem möglichen Zeichenumfang an Unicode angeglichen wurde.
  • Die Unicode-Bereiche U+D800 bis U+DBFF und U+DC00 bis U+DFFF sind ausdrücklich keine Zeichen, sondern dienen nur in UTF-16 zur Kodierung von Zeichen außerhalb der Basic Multilingual Plane, sie wurden früher als Low und High surrogates bezeichnet. Folglich sind Bytefolgen, die diesen Bereichen entsprechen, auch kein gültiges UTF-8.

Ein paar Beispiele:

Das letzte Beispiel (Violinschlüssel 𝄞) liegt außerhalb des ursprünglich in Unicode (unter Version 2.0) enthaltenen Codebereiches (16 Bit), der in der aktuellen Unicode-Version als BMP-Bereich (Ebene 0) enthalten ist. Da derzeit viele Schriftarten diese neuen Unicode-Bereiche noch nicht enthalten, können die dort enthaltenen Zeichen auf vielen Plattformen nicht korrekt dargestellt werden. Stattdessen wird ein Ersatzzeichen dargestellt, welches als Platzhalter dient.

Die Spezifikation von UTF-8 definiert auch die exakte Byte-Reihenfolge. Daher gibt es für UTF-8 keine Big-Endian und Little-Endian Varianten (wie das bei UTF-16 und UTF-32 der Fall ist), egal auf welchem System die Codierung gebraucht wird.

UTF-16

UTF-16 ist eine Kodierung mit variabler Länge für Unicode-Zeichen. UTF-16 ist für die häufig gebrauchten Zeichen aus der Basic multilingual plane (BMP, Ebene 0) optimiert. Es ist das älteste der Unicode-Kodierungsformate.

Bei der UTF-16-Kodierung wird jedem Unicode-Zeichen eine speziell kodierte Kette von ein oder zwei 16-Bit-Einheiten zugeordnet, so dass sich wie auch bei den anderen UTF-Formaten alle Unicode-Zeichen abbilden lassen.

Während UTF-8 eine zentrale Bedeutung in Internet-Protokollen hat, wird UTF-16 vielerorts zur internen Zeichenkettenrepräsentation verwendet, beispielsweise in aktuellen Versionen von Java und .NET.

Aufgrund der Kodierung aller Zeichen der BMP in zwei Bytes hat die UTF-16-Kodierung den doppelten Platzbedarf im Vergleich zu UTF-8 codierten Texten, welche hauptsächlich aus lateinischen Buchstaben bestehen. Werden jedoch viele BMP-Zeichen jenseits des Codepoints U+007F verwendet, hat UTF-16 vergleichbaren, bei vielen Zeichen jenseits von U+07FF sogar weniger Platzbedarf als UTF-8.

Die Zeichen der BMP werden direkt auf die 16 Bits einer UTF-16-Code-Unit abgebildet. Unicode-Zeichen außerhalb der BMP (d. h. U+10000 bis U+10FFFF) werden durch zwei 16-Bit-Wörter (engl. code units) dargestellt, die wie folgt gebildet werden:

Aufbau von UTF-16

Von der Nummer des Zeichens wird zunächst die Zahl 65536 (10000hex) abgezogen (= Größe der BMP), wodurch eine 20-Bit-Zahl im Bereich von 00000hex bis FFFFFhex entsteht, die anschließend in zwei Blöcke zu je 10 Bit aufgeteilt und dem ersten Block die Bitfolge 110110, dem zweiten Block dagegen die Bitfolge 110111 vorangestellt wird. Das erste der beiden so entstandenen 16-Bit-Wörter bezeichnet man als High-Surrogate, das zweite als Low-Surrogate, und ihren Namen entsprechend enthält das High-Surrogate die 10 höherwertigen, das Low-Surrogate die 10 niederwertigen Bits des um 65536 verringerten ursprünglichen Zeichencodes.

Die Codebereiche von U+D800 bis U+DBFF (High-Surrogates) und von U+DC00 bis U+DFFF (Low-Surrogates) sind speziell für solche UTF-16-Ersatzzeichen reserviert und enthalten daher keine eigenständigen Zeichen.

Bei der Umwandlung von UTF-16-kodierten Zeichenketten in UTF-8-Bytefolgen ist zu beachten, dass Paare aus High- und Low-Surrogates zuerst wieder zu jeweils einem Unicode-Zeichencode zusammengefasst werden müssen, bevor dieser dann in eine UTF-8-Bytefolge umgewandelt werden kann.

UTF-32

UTF-32 ist eine Methode zur Kodierung von Unicode-Zeichen, bei der jedes Zeichen mit vier Byte (32 Bit) kodiert wird. Sie kann deshalb als die einfachste Kodierung bezeichnet werden, da alle anderen UTF-Kodierungen variable Bytelängen benutzen.

Vorteile

UTF-32 zeigt seine besonderen Vorteile beim wahlfreien Zugriff auf ein bestimmtes Zeichen, da die Adresse des n-ten Zeichens durch einfachste Zeigerarithmetik ermittelt werden kann, da jedes Zeichen gleich lang ist (4 Bytes). Es ist auch möglich, anhand der Größe eines Dokuments in Bytes umgehend die Anzahl der enthaltenen Zeichen auszurechnen (nämlich durch eine simple Division durch 4).

Nachteile

Der entscheidende Nachteil von UTF-32 ist der hohe Speicherbedarf. Bei Texten, die überwiegend aus lateinischen Buchstaben bestehen, wird – verglichen mit dem verbreiteten UTF-8- oder den ISO-8859-Zeichensätzen – etwa der vierfache Speicherplatz belegt. Deshalb wird es auch kaum zum externen Speichern verwendet. Ein weiterer Nachteil ist die fehlende Abwärtskompatibilität zu ASCII, wie sie z. B. mit UTF-8 gegeben ist.

Es existieren in Unicode zusammengesetzte Zeichen, die mehr als einen Codepoint benötigen (z. B. Zeichen mit ungewöhnlichen oder mehrfachen Akzenten, wie sie z. B. im Vietnamesischen vorkommen). Sollen derartige Zeichen korrekt verarbeitet werden, ist auch in einer UTF-32-kodierten Zeichenkette kein wahlfreier Zugriff auf einzelne Zeichen möglich, wie dies unter „Vorteile“ geschrieben wurde.

Byte Order Mark (BOM)

Die Byte Order Mark (BOM; deutsch Byte-Reihenfolge-Markierung) ist ein Zeichen welches in Unicode definiert wird und sich an der Stelle U+FEFF befindet. Es kann als erstes Zeichen am Anfang eines Datenstroms eingefügt werden, um a) zu kennzeichnen, dass es sich um ein Dokument mit Unicode Codierung handelt und b) um aufzuzeigen, um welche UTF-Codierung es sich handelt. Zusätzlich kann in der UTF-16  und UTF-32 Codierung über das BOM Zeichen noch herausgefunden werden, ob es sich um eine Big-Endian oder um eine Little-Endian Byte-Reihenfolge handelt.

Je nachdem, welches der beiden Bytes zuerst übertragen bzw. gespeichert wird, spricht man von Big Endian (UTF-16BE) oder Little Endian (UTF-16LE). Unabhängig davon kommt die High Surrogate vor der Low Surrogate. Für ASCII-Zeichen, die nach UTF-16 übersetzt werden, bedeutet dies, dass das hinzugefügte 0-Zeichen bei Big Endian vorangestellt und bei Little Endian nachgestellt wird. Wird das BOM-Zeichen als das ungültige Unicode-Zeichen U+FFFE (not a character) interpretiert, heißt das, dass die Byte-Reihenfolge zwischen Sender und Empfänger verschieden ist und die Bytes jedes 16-Bit-Worts beim Empfänger vertauscht werden müssen, um den sich anschließenden Datenstrom korrekt auszuwerten.

Bei unzureichend spezifizierten Protokollen wird empfohlen, BOM-Zeichen (U+FEFF) an den Anfang des Datenstroms zu setzen.

Untenstehende Tabelle zeigt die Darstellung des BOM-Zeichens in den verschiedenen UTF-Codierungen:

Quellen

Primär Wikipedia und einige weitere…