Computer lesen nur binäre Zahlen, Menschen nutzen ein Dezimalsystem. Eine Schnittstelle zwischen diesen Formen ist das Hexadezimalsystem. Es hilft dabei, lange Bit-Ketten kompakt darzustellen. Es verwendet die Ziffern 0 bis 9 und die Buchstaben A bis F und agiert auf der Basis der Zahl 16. Als vierte Potenz von 2 eignet sich das Hexadezimalsystem besser als das Dezimalsystem dafür, achtstellige Byte-Bereiche darzustellen. Eine Hexadezimalziffer steht für eine Viererkette („Nibble“) innerhalb des Oktetts. Ein Byte mit acht Binärziffern kann also mit nur zwei Hexadezimalziffern dargestellt werden. Unicode nutzt das Hexadezimalsystem dafür, die Position eines Zeichens innerhalb des eigenen Systems zu beschreiben. Daraus lassen sich die binäre Zahl und schließlich der UTF-8-Codepoint errechnen.
Zuerst muss die Binärzahl aus der Hexadezimalzahl umgewandelt werden. Dann passen Sie die Codepoints in die Struktur der UTF-8-Codierung ein. Um sich die Strukturierung zu erleichtern, nutzen Sie folgende Übersicht, die zeigt, wie viele Codepoints in eine Byte-Kette passen und welche Struktur Sie in welchem Unicode-Wertebereich zu erwarten haben.
Größe in Byte | freie Bits zur Bestimmung | erster Unicode-Codepoint | letzter Unicode-Codepoint | Start-Byte / Byte 1 | Folge-Byte 2 | Folge-Byte 3 | Folge-Byte 4 |
1 | 7 | U+0000 | U+007F | 0xxxxxxx | | | |
2 | 11 | U+0080 | U+07FF | 110xxxxx | 10xxxxxx | | |
3 | 16 | U+0800 | U+FFFF | 1110xxxx | 10xxxxxx | 10xxxxxx | |
4 | 21 | U+10000 | U+10FFFF | 11110xxx | 10xxxxxx | 10xxxxxx | 10xxxxxx |
Innerhalb eines Code-Bereichs können Sie eine Anzahl verwendeter Bytes voraussetzen, da die lexikalische Ordnung bei der Nummerierung der Unicode-Codepoints und UTF-8-Binärzahlen eingehalten wird. Innerhalb des Bereiches U+0800 und U+FFFF nutzt UTF-8 also 3 Bytes. Es stehen 16 Bits dafür zur Verfügung, den Codepoint eines Symbols auszudrücken. Die Einordnung einer errechneten Binärzahl in das UTF-8-Schema erfolgt von rechts nach links, wobei Sie etwaige Leerstellen links mit Nullen auffüllen.
Beispielrechnung:
Das Zeichenᅢ(Hangul Junseong, Ä) steht in Unicode an Stelle U+1162. Um die Binärzahl zu berechnen, wandeln Sie zuerst die Hexadezimalzahl in eine Dezimalzahl um. Jede Stelle in der Zahl entspricht der korrelierenden Potenz von 16. Die rechte Ziffer hat dabei den niedrigsten Wert mit 160 = 1. Von rechts beginnend, multiplizieren Sie den Zahlenwert der Ziffer mit dem der Potenz. Anschließend addieren Sie die Ergebnisse.
2 | * | 1 | = | 2 |
6 | * | 16 | = | 96 |
1 | * | 256 | = | 256 |
1 | * | 4096 | = | 4096 |
4450 |
4450 ist die berechnete Dezimalzahl. Diese wandeln Sie nun in eine Binärzahl um. Dazu teilen Sie die Zahl so lange mit Rest durch 2, bis das Ergebnis 0 ist. Der Rest, von rechts nach links aufgeschrieben, ist die Binärzahl.
4450 | : 2 | = | 2225 | Rest: | 0 |
2225 | : 2 | = | 1112 | Rest: | 1 |
1112 | : 2 | = | 556 | Rest: | 0 |
556 | : 2 | = | 278 | Rest: | 0 |
278 | : 2 | = | 139 | Rest: | 0 |
139 | : 2 | = | 69 | Rest: | 1 |
69 | : 2 | = | 34 | Rest: | 1 |
34 | : 2 | = | 17 | Rest: | 0 |
17 | : 2 | = | 8 | Rest: | 1 |
8 | : 2 | = | 4 | Rest: | 0 |
4 | : 2 | = | 2 | Rest: | 0 |
2 | : 2 | = | 1 | Rest: | 0 |
1 | : 2 | = | 0 | Rest: | 1 |
Ergebnis: 1000101100010 |
hexadezimal | binär |
0 | 0000 |
1 | 0001 |
2 | 0010 |
3 | 0011 |
4 | 0100 |
5 | 0101 |
6 | 0110 |
7 | 0111 |
8 | 1000 |
9 | 1001 |
A | 1010 |
B | 1011 |
C | 1100 |
D | 1101 |
E | 1110 |
F | 1111 |
Der UTF-8-Code schreibt für den Codepoint U+1162 3 Bytes vor, denn der Codepoint liegt zwischen U+0800 und U+FFFF. Das Start-Byte beginnt also mit 1110. Die zwei Folge-Bytes beginnen jeweils mit 10. Die Binärzahl ergänzen Sie in den freien Bits, welche nicht die Struktur vorgeben, von rechts nach links. Übrige Bit-Stellen im Start-Byte ergänzen Sie mit 0, bis das Oktett voll ist. Die UTF-8-Codierung sieht dann so aus:
11100001 10000101 10100010(der eingefügte Codepoint ist gefettet)
Zeichen | Unicode-Codepoint, hexadezimal | Dezimalzahl | Binärzahl | UTF-8 |
ᅢ | U+1162 | 4450 | 1000101100010 | 11100001 10000101 10100010 |