Inhaltsverzeichnis

Zeichendarstellung mit Unicode und UTF-8

Unicode

Um Probleme, die sich zum einen mit unterschiedlichen Zeichensätzen, zum anderen auch durch andere Sprachen, die mehr als 128 Zeichen umfassen, ergeben haben, wurde der Unicode-Standard entwickelt.

Unicode ist ein internationaler Standard, in dem langfristig für jedes sinnvolle Schriftzeichen oder Textelement aller bekannten Schriftkulturen und Zeichensysteme ein digitaler Code festgelegt wird. Ziel ist es, die Verwendung unterschiedlicher und inkompatibler Kodierungen in verschiedenen Ländern oder Kulturkreisen zu beseitigen. Unicode wird ständig um Zeichen weiterer Schriftsysteme durch das Unicode-Konsortium ergänzt. (Wikipedia, https://de.wikipedia.org/wiki/Unicode)

Im Unicode Standard hat jedes Zeichen einen eigenen "Unicode-Code", damit lassen sich derzeit 1.111.998 elementare Zeichen ("Codepunkte") abbilden. Darstellung: U+00DF (Mindestens 4x4Bit, bis zu U+10FFFF) Diese Codepunkte bilden den Unicode Zeichensatz.

Der Codepoint eines Unicode-Zeichens ist nur eine abstrakte Nummer. Die Schreibweise dieser Nummer im Unicode-Standard erfolgt in hexadezimalen Zahlen mit vorangestelltem "U+". Der Codepoint legt noch keine computerkompatible Darstellung fest, dies ist Aufgabe der eigentlichen Codierung. Da die Unicode-Codepoints von U+0000 bis U+10FFFF (hexadezimale Zahlendarstellung), mit einer beabsichtigten Lücke zwischen U+D7FF und U+E000, reichen, sind für eine vollständige Codierung des gesamten Codepoint-Bereichs als Binärzahl mindestens 3 Byte erforderlich.1)

Frage: Wie kann man die "Zeichennummern", also die Codepunkte als Bitmuster darstellen? Dieser Vorgang ist die Codierung der Unicode Zeichen.
UTF-32 UTF-16 UTF-8
Jeder Codepoint wird durch 4 Bytes dargestellt. Das reicht für alle Codepoints verschwendet aber Ressourcen - einfach aber verschwenderisch. Jeder Codepoint wird durch 2 Bytes dargestellt, halbiert also den Speicherverbrauch von UTF-32. 2 Bytes reichen nicht für alle Codepoints, deswegen muss man tricksen, indem man die oben erwähnte Lücke zwischen U+D7FF und U+E000 nutzt. Details finden sich hier. UTF-8 nutzt 8 Bit lange Codeblöcke. UTF-8 verwendet je nach Bedarf zwischen 1 und 4 Byte, um einen Codepoint darzustellen. Ein codiertes Zeichen hat also keine feste Bitlänge.

UTF-8 hat im Vergleich zu den anderen UTF-Varianten mehrere praktische Vorteile:2)

Das führt zu folgender Darstellung aller Unicode Zeichen:

Unicode-Bereich Binäre Zahldarstellung 1. Byte 2. Byte 3. Byte 4. Byte
U+0000–U+007F 00000000 0xxxxxxx 0xxxxxxx
U+0080–U+07FF 00000yyy yyxxxxxx 110yyyyy 10xxxxxx
U+0800–U+D7FF, U+E000–U+FFFF zzzzyyyy yyxxxxxx 1110zzzz 10yyyyyy 10xxxxxx
U+10000–U+10FFFF 000uuuuu zzzzyyyy yyxxxxxx 11110uuu 10uuzzzz 10yyyyyy 10xxxxxx

UTF-8 Implementation des Unicode Zeichensatzes

Hier kann ein einzelnes Zeichen in der UTF-8-Codierung bis zu 4 Bytes umfassen, nach folgenden Regeln:

Beispiele:

(1)

k = 6B16 = 0110 10112

Beginnt mit einer Null und ist nicht länger als ein Byte → die letzten 7Bit werden verwendet, um zu codieren, also ein "ASCII k" in UTF-8

UTF-8: 0110 1011

(2)

ä = E416 = 1110 01002

Nur ein Byte lang, beginnt aber mit einer 1. Die 8 Bit müssen in 6 Bit Abschnitte geteilt und auf 2 Byte verteilt werden, beginnend von rechts, links wird stets mit 0en aufgefüllt:

000011 100100

Die UTF-8 Codierung des Unicode-ä ist also 1100 0011 1010 0100. Die Nutzdaten, die den Code des Unicode Zeichens transportieren sind in jeden Byte nur die jeweils letzten 6 Bit.

(3)

乐 → U+4E50 → 4E5016 → 0100 1110 0101 00002

Die UTF-8 Codierung des Unicode-Zeichens 乔 ist also 3 Byte lang und sieht so aus: 1110 0100 1011 1001 1001 0000


(A1)

Wandle die nachfolgenden Zeichen des Unicode Zeichensatzen in die UTF-8-Codierung um. Der Hexadezimalcode des Unicode Zeichens ist jeweils angegeben.

Gehe jeweils wie in den Beispielen oben vor. Markiere die "Nutzdaten" die das eigentlich Unicode-Zeichen "transportieren".

  1. I=4916
  2. Ö=D616
  3. 弈=5F0816
  4. 😊=1F60A16

Lösung 1

Lösung 2

Lösung 3

Lösung 4


(A2)

Wie viele unterschiedliche Unicode-Zeichen lassen sich theoretisch mit 1 Byte, 2 Bytes, 3 Bytes und 4 Bytes unter Beachtung der UTF-8-Regeln darstellen?

Lösung


(A3)

Öffne einen Texteditor, z.B. Bluefish. Schreibe den Buchstaben a in den Editor. Speichere die Datei. Finde heraus wie groß die Datei ist. Betrachte den binären Inhalt der Datei mit einem Hex-Editor oder einem passenden Anzeigeprogramm, z.B. hexyl.

Das sollte etwas so aussehen:

Interpretiere die Ausgaben und notiere dir die Ergebnisse.

Wiederhole den Versuch mit einem ä.


(A4)

Untersuche nun den Teufelssmiley 😈 Kopiere das Zeichen für den Smiley aus der Wikiseite in Bluefish und widerhole dei Überprüfungen aus Aufgabe 3.

Weitere Informationen findest du dort. https://www.compart.com/de/unicode/U+1F608

Modellvorstellung: Der UTF-8-Zug

Material

FilenameFilesizeLast modified
a.png19.9 KiB28.11.2023 11:46
cs.png25.6 KiB28.11.2023 10:52
unicode.odp1.2 MiB29.11.2023 10:26
unicode.pdf810.2 KiB29.11.2023 10:26
zug.png184.4 KiB29.11.2023 10:25

CC-BY-SA Frank Schiebel, mit Material von Kimmig, ZPG Informatik BW

1) , 2)
Teile dieser Wikiseite sind dem SelfHTML Wiki entnommen uns stehen unter CC-BY-SA Linzenz https://wiki.selfhtml.org/wiki/Zeichencodierung/Unicode
3)
des Codepoints
4)
Warum?