UTF-8
aus Wikipedia, der freien Enzyklopädie
UTF-8 (Abk. für 8-bit Unicode Transformation Format) ist die am weitesten verbreitete Kodierung für Unicode-Zeichen.
Dabei wird jedem Unicode-Zeichen eine speziell kodierte Bytekette von variabler Länge zugeordnet. UTF-8 unterstützt bis zu 4 Byte, auf die sich wie bei allen UTF-Formaten alle 1.114.112 Unicode-Zeichen abbilden lassen.
UTF-8 hat eine zentrale Bedeutung als globale Zeichenkodierung im Internet. Die Internet Engineering Task Force verlangt von allen neuen Internetkommunikationsprotokollen, dass die Zeichenkodierung deklariert wird und dass UTF-8 eine der unterstützten Kodierungen ist. Das Internet Mail Consortium (IMC) empfiehlt [1], dass alle E-Mail-Programme UTF-8 darstellen und senden können. 2007 wird diese Empfehlung allerdings immer noch nicht universell befolgt.
Inhaltsverzeichnis |
[Bearbeiten] Normierung
UTF-8 ist von der IETF, dem Unicode Consortium und der ISO gegenwärtig identisch definiert in den Normdokumenten:
- RFC 3629 / STD 63 (2003)
- The Unicode Standard, Version 4.0, §3.9–§3.10 (2003)
- ISO/IEC 10646-1:2000 Annex D (2000)
Diese lösen ältere, teilweise abweichende Definitionen ab, die teilweise noch von älterer Software benutzt werden:
- ISO/IEC 10646-1:1993 Amendment 2 / Annex R (1996)
- The Unicode Standard, Version 2.0, Appendix A (1996)
- RFC 2044 (1996)
- RFC 2279 (1998)
- The Unicode Standard, Version 3.0, §2.3 (2000) und Corrigendum #1: UTF-8 Shortest Form (2000)
- Unicode Standard Annex #27: Unicode 3.1 (2001)
[Bearbeiten] Kodierung
Unicode-Zeichen mit den 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. Insofern 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.
Unicode-Bereich | UTF-8-Kodierung | Bemerkungen | Möglichkeiten | |
---|---|---|---|---|
0000 0000–0000 007F | 0xxxxxxx | In diesem Bereich (128 Zeichen) entspricht UTF-8 genau dem ASCII-Code: Das höchste Bit ist 0, die restliche 7-Bit-Kombination ist das ASCII-Zeichen. | 27 | 128 |
0000 0080–0000 07FF | 110xxxxx 10xxxxxx | Das erste Byte enthält binär 11xxxxxx, die folgenden Bytes 10xxxxxx; die x stehen für die fortlaufende Bitkombination des Unicode-Zeichens. Die Anzahl der Einsen ausgehend von der höchsten 0 im ersten Byte ist die Anzahl der Bytes für das Zeichen. (In Klammern jeweils die theoretisch maximal möglichen.) | 211 − 27 (211) |
1.920 (2.048) |
0000 0800–0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx | 216 − 211 (216) |
63.488 (65.536) |
|
0001 0000–0010 FFFF [0001 0000–001F FFFF] | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx | 220 (221) |
1.048.576 (2.097.152) |
Der Algorithmus lässt theoretisch bis zu sieben Bytes lange Byteketten und dadurch mehrere Milliarden Zeichen zu (27 + 2(1·6+5) + 2(2·6+4) + 2(3·6+3) + 2(4·6+2) + 2(5·6+1) + 2(6·6+0) = 70.936.234.112 > 236), in seiner Verwendung als UTF-Kodierung ist er aber auf den gemeinsamen Coderaum aller Unicode-Kodierungen beschränkt, also von 0 bis 0010 FFFF (1.114.112 Möglichkeiten) und weist maximal vier Bytes lange Byteketten auf.
Das erste Byte eines UTF-8-kodierten Zeichens nennt man dabei Start-Byte, weitere Bytes nennt man Folgebytes. Startbytes enthalten also die Bitfolge 11xxxxxx oder 0xxxxxxx, Folgebytes immer die Bitfolge 10xxxxxx.
- Ist das höchste Bit des ersten Byte 0, handelt es sich um ein gewöhnliches ASCII-Zeichen, da ASCII eine 7-Bit-Kodierung ist und die ersten 128 Zeichen des Unicode die ASCII-Zeichen sind. Damit sind alle ASCII-Dokumente automatisch aufwärtskompatibel zu UTF-8.
- Ist das höchste Bit des ersten Byte 1, handelt es sich um ein Mehrbytezeichen, also ein Unicode-Zeichen mit einer Zeichennummer größer als 127.
- Sind die höchsten beiden Bits des ersten Byte 11, handelt es sich um das Start-Byte eines Mehrbytezeichens, sind sie 10, um ein Folge-Byte.
- Die lexikalische Ordnung nach Byte-Werten entspricht der lexikalischen Ordnung nach Buchstaben-Nummern, da höhere Zeichennummern mit entsprechend mehr 1-Bits im Start-Byte kodiert werden.
- Bei den Start-Bytes 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 nach dem höchsten 0-Bit entspricht der Anzahl an Folgebytes plus eins, z. B. 1110xxxx 10xxxxxx 10xxxxxx = 3 Bits nach dem höchsten 0-Bit = 3 Bytes insgesamt, 2 Bits nach dem höchsten 0-Bit vor dem höchsten 1-Bit = 2 Folgebytes.
- Start-Bytes (0xxx xxxx oder 11xx xxxx) und Folge-Bytes (10xx xxxx) lassen sich eindeutig voneinander unterscheiden. Somit kann ein Byte-Strom auch in der Mitte gelesen werden, ohne dass es Probleme mit der Dekodierung gibt, was insbesondere bei der Wiederherstellung defekter Daten wichtig ist. 10xxxxxx Bytes werden einfach übersprungen, bis ein 0xxxxxxx oder 11xxxxxx Byte gefunden wird. Könnten Start-Bytes und Folge-Bytes nicht eindeutig voneinander unterschieden werden, wäre das Lesen eines UTF-8-Datenstroms, dessen Beginn unbekannt ist, unter Umständen nicht möglich.
Zu beachten:
- Das gleiche Zeichen kann theoretisch auf verschiedene 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 rechtsbündig angeordnet – das rechte Bit des Unicode-Zeichens steht also immer im rechten Bit des letzten UTF-8-Bytes.
- Ursprünglich gab es auch Kodierungen mit mehr als 4 Oktetts (bis zu 6), diese sind jedoch ausgeschlossen worden, da es in Unicode keine korrespondierenden Zeichen gibt und ISO 10646 in seinem möglichen Zeichenumfang an Unicode angeglichen wurde.
- Für alle auf dem lateinischen Alphabet basierenden Schriften ist UTF-8 die platzsparendste Methode zur Abbildung von Unicode-Zeichen.
- Die Unicodebereiche U+D800-U+DBFF und U+DC00-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 Byte-Folgen, die diesen Bereichen entsprechen, kein gültiges UTF-8. Zum Beispiel wird U+10400 in UTF-16 als D801,DC00 dargestellt, sollte in UTF-8 aber als F0,90,90,80 und nicht als ED,A0,81,ED,B0,80 ausgedrückt werden. Java unterstützt dies seit der Version 1.5 [2]. Aufgrund der weiten Verbereitung der falschen Kodierung, insbesondere auch in Datenbanken, wurde diese Kodierung eigens als CESU-8 normiert.
- In UTF-8, UTF-16 und UTF-32 ist der gesamte Wertebereich von Unicode kodiert.
Zeichen | Unicode | Unicode binär | UTF-8 binär | UTF-8 hexadezimal |
---|---|---|---|---|
Buchstabe y | U+0079 | 00000000 01111001 | 01111001 | 0x79 |
Buchstabe ä | U+00E4 | 00000000 11100100 | 11000011 10100100 | 0xC3 0xA4 |
Zeichen für eingetragene Marke ® | U+00AE | 00000000 10101110 | 11000010 10101110 | 0xC2 0xAE |
Euro-Zeichen € | U+20AC | 00100000 10101100 | 11100010 10000010 10101100 | 0xE2 0x82 0xAC |
Violinschlüssel 𝄞 | U+1D11E | 00000001 11010001 00011110 | 11110000 10011101 10000100 10011110 | 0xF0 0x9D 0x84 0x9E |
Das letzte Beispiel liegt außerhalb des ursprünglich in Unicode (unter Version 2.0) enthaltenen Codebereiches (16 Bit), der in der aktuellen Unicode-Version 4.1.0 als BMP-Bereich (Ebene 0) enthalten ist, im SMP-Bereich (Ebene 1). 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.
[Bearbeiten] Quellen
- ↑ http://www.imc.org/mail-i18n.html
- ↑ http://java.sun.com/developer/technicalArticles/Intl/Supplementary/
[Bearbeiten] Weblinks
Wiktionary: UTF-8 – Bedeutungserklärungen, Wortherkunft, Synonyme und Übersetzungen |
- Wie UTF-8 ASCII und ISO 8859-1 in der GNU/Linux- und Unix-Welt ersetzen kann
- UTF-8, a transformation format of ISO 10646
- Anmerkungen zur Geschichte des UTF-8
- Ein UTF-8-Beispiel
- Eine Unicode-Datenbank mit Kommentaren und Erklärungen
- Unicode-Datenbank in HTML
- UTF-8-Codetabelle mit Unicode-Zeichen – UTF-8-Kodierung aller Unicode-Positionen mit Zusatzinformationen
- UTF-8 Check mit PHP