Was ist Unicode-Kodierung?
Unicode ist ein universeller Zeichenkodierungsstandard, der jedem Zeichen, das in menschlichen Sprachen verwendet wird, eine eindeutige Nummer – einen sogenannten Codepunkt – zuweist. Vor Unicode gab es Dutzende inkompatibler Kodierungssysteme. Ein auf Russisch in einem System verfasstes Dokument war auf einem anderen nicht lesbar. Unicode löst dies, indem es einen einzigen, vereinheitlichten Zeichensatz bereitstellt, der über 150 Schriften und 140.000 Zeichen abdeckt.
Unicode selbst ist keine Kodierung. Es ist ein Zeichenrepertoire. Die Kodierungsebene – wie Codepunkte als Bytes gespeichert werden – wird von Kodierungsformen wie UTF-8, UTF-16 und UTF-32 übernommen. Das Verständnis des Unterschieds zwischen einem Codepunkt und seiner Byte-Darstellung ist der Schlüssel zur Vermeidung von Kodierungsfehlern.
Codepunkte
Jedes Unicode-Zeichen hat einen Codepunkt, der als U+ gefolgt von einer hexadezimalen Zahl geschrieben wird. Der Buchstabe A ist U+0041, das Eurozeichen ist U+20AC, und das Emoji 😀 ist U+1F600.
Codepunkte sind in 17 Ebenen organisiert, die jeweils 65.536 Zeichen enthalten. Die erste Ebene (Ebene 0) ist die Basis-Mehrsprachige Ebene (BMP), die die gebräuchlichsten Zeichen enthält, darunter Lateinisch, Griechisch, Kyrillisch, CJK und viele andere. Die Ebenen 1 bis 16 enthalten zusätzliche Zeichen wie Emojis, historische Schriften und seltene CJK-Zeichen.
| Ebene | Bereich | Name |
|---|---|---|
| 0 | U+0000 bis U+FFFF | Basis-Mehrsprachige Ebene (BMP) |
| 1 | U+10000 bis U+1FFFF | Ergänzende Mehrsprachige Ebene (SMP) |
| 2 | U+20000 bis U+2FFFF | Ergänzende Ideografische Ebene (SIP) |
| 3-13 | U+30000 bis U+DFFFF | Nicht zugewiesen |
| 14 | U+E0000 bis U+EFFFF | Ergänzende Spezialzweck-Ebene (SSP) |
| 15-16 | U+F0000 bis U+10FFFF | Privatnutzungs-Ebenen |
UTF-8, UTF-16, UTF-32
Diese drei Kodierungsformen unterscheiden sich darin, wie sie Codepunkte auf Bytes abbilden.
UTF-8
UTF-8 ist die dominierende Kodierung im Web. Es verwendet 1 bis 4 Bytes pro Zeichen und ist abwärtskompatibel mit ASCII. Zeichen im ASCII-Bereich (U+0000 bis U+007F) verwenden ein Byte. Europäische Schriften verwenden zwei Bytes. CJK-Zeichen und Emojis verwenden drei oder vier Bytes.
| Codepunkt-Bereich | Byte 1 | Byte 2 | Byte 3 | Byte 4 |
|---|---|---|---|---|
| U+0000 - U+007F | 0xxxxxxx | |||
| U+0080 - U+07FF | 110xxxxx | 10xxxxxx | ||
| U+0800 - U+FFFF | 1110xxxx | 10xxxxxx | 10xxxxxx | |
| U+10000 - U+10FFFF | 11110xxx | 10xxxxxx | 10xxxxxx | 10xxxxxx |
UTF-8-Vorteile:
- ASCII-Text ist gültiges UTF-8 (keine Konvertierung erforderlich)
- Selbstsynchronisierend: Zeichengrenzen sind immer auffindbar
- Keine Byte-Reihenfolge-Probleme (Little-Endian / Big-Endian)
- Platzsparendste Kodierung für lateinische Schrift
UTF-16
UTF-16 verwendet 2 Bytes (eine Code-Einheit) für BMP-Zeichen und 4 Bytes (zwei Code-Einheiten, sogenannte Surrogatpaare) für zusätzliche Zeichen. Windows, Java und JavaScript verwenden intern UTF-16.
UTF-16 hat Probleme mit der Byte-Reihenfolge. Eine UTF-16-Datei muss angeben, ob sie Little-Endian (UTF-16LE) oder Big-Endian (UTF-16BE) ist, typischerweise unter Verwendung eines BOM (Byte Order Mark) am Anfang.
UTF-32
UTF-32 verwendet genau 4 Bytes für jeden Codepunkt. Es ist einfach, aber verschwenderisch. Eine rein ASCII-Datei wird viermal größer. UTF-32 wird in der Praxis selten verwendet.
Vergleich
| Merkmal | UTF-8 | UTF-16 | UTF-32 |
|---|---|---|---|
| Bytes pro Zeichen | 1-4 | 2 oder 4 | 4 |
| ASCII-Kompatibilität | Ja | Nein | Nein |
| Web-Nutzung | ~98 % | ~2 % | <0,01 % |
| BOM erforderlich | Nein | Ja | Ja |
| Verbreitet in | Web, Linux, JSON | Windows, Java, JS | Interne Verarbeitung |
Kodierungsfehler
Der häufigste Kodierungsfehler ist die Behandlung von Bytes als Zeichen. Wenn Sie eine UTF-8-Zeichenkette nehmen und als Latin-1 (ISO 8859-1) interpretieren, erscheinen akzentuierte Zeichen als verstümmelte Symbole. Dies passiert, wenn die Kodierung nicht deklariert ist oder wenn ein Tool die falsche Kodierung annimmt.
Ein weiteres häufiges Problem ist das Zählen von Bytes anstatt von Zeichen. In UTF-8 ist die Zeichenkette "café" 4 Zeichen, aber 5 Bytes, weil é zwei Bytes verwendet. Funktionen wie PHPs strlen zählen standardmäßig Bytes, während mb_strlen Zeichen zählt.
Programmierbeispiele
// PHP - immer mb_*-Funktionen für UTF-8 verwenden
$text = 'café ☕';
echo strlen($text); // 8 Bytes (falsche Zählung)
echo mb_strlen($text, 'UTF-8'); // 6 Zeichen
// Unicode-Codepunkte kodieren/dekodieren
echo mb_convert_encoding($text, 'UTF-16', 'UTF-8');
# Python 3 - Zeichenketten sind standardmäßig Unicode
text = 'café ☕'
print(len(text)) # 6 Zeichen
bytes_utf8 = text.encode('utf-8')
bytes_utf16 = text.encode('utf-16')
print(bytes_utf8) # b'caf\xc3\xa9 \xe2\x98\x95'
// JavaScript - Zeichenketten sind intern UTF-16
let text = 'café ☕';
console.log(text.length); // 6 (aber Emoji kann als 2 zählen)
// Als UTF-8-Bytes kodieren
let encoder = new TextEncoder();
let bytes = encoder.encode(text);
console.log(bytes); // Uint8Array(8)
Online-Tool
Der Unicode Encoder & Decoder auf Help2Code konvertiert Text in Unicode-Codepunkte und zwischen UTF-8-, UTF-16- und UTF-32-Darstellungen. Er ist nützlich zum Debuggen von Kodierungsproblemen und zum Lernen, wie Unicode funktioniert.
Fazit
Unicode-Kodierung ist essentielles Wissen für jeden Entwickler, der mit internationalem Text arbeitet. UTF-8 ist der Standard für das Web und sollte Ihre Standardeinstellung sein. Das Verständnis des Unterschieds zwischen Codepunkten und Byte-Darstellungen hilft Ihnen, die häufigsten Textkodierungsfehler zu vermeiden. Verwenden Sie den Unicode Encoder & Decoder, um mit Kodierungen zu experimentieren und Kodierungsprobleme zu debuggen.