EMZETT.
Login

Unicode

Kurz: Ein internationaler Standard, der jedem Zeichen aus praktisch jeder Schrift der Welt eine eindeutige Nummer (Codepoint) zuweist.

Genauer: Löst das Problem, dass ältere Zeichensätze (z. B. ASCII) nur wenige Zeichen abdeckten und für andere Sprachen/Symbole (Emojis, kyrillische oder asiatische Schriftzeichen) unbrauchbar waren. Wie diese Codepoints als Bytes gespeichert werden, regeln Kodierungen wie UTF-8 oder UTF-16 — Unicode selbst definiert nur die Zuordnung Zeichen ↔ Nummer, nicht das Byte-Format.

Im Detail

ASCII (aus den 1960ern) kodierte nur 128 Zeichen in 7 Bit — genug für die englische Tastatur, aber nicht für Umlaute, Akzente oder gar nicht-lateinische Schriften. Jedes Land/jeder Hersteller entwickelte daraufhin eigene, inkompatible Erweiterungen (z. B. ISO-8859-1 für Westeuropa), was beim Datenaustausch zwischen Systemen mit unterschiedlicher Kodierung zu kaputten Zeichen führte (“Mojibake”, z. B. “ä” statt “ä”). Unicode löst das, indem es EINE einzige, weltweit gültige Nummer (Codepoint, geschrieben als U+00E4 für “ä”) pro Zeichen definiert — unabhängig von Sprache, Plattform oder Programm.

UTF-8 hat sich als dominante Kodierung im Web durchgesetzt, weil es abwärtskompatibel zu ASCII ist: die ersten 128 Zeichen belegen exakt 1 Byte (identisch zu ASCII), weitere Zeichen (Umlaute, Emojis, chinesische Schriftzeichen) je nach Komplexität 2 bis 4 Bytes. Das macht UTF-8 speichereffizient für überwiegend englischen Text und trotzdem vollständig kompatibel mit jedem Unicode-Zeichen der Welt:

"ä".encode("utf-8")  # b'\xc3\xa4' - 2 Bytes für ein Zeichen
"A".encode("utf-8")  # b'A' - 1 Byte, identisch zu ASCII

Ein häufiger Praxis-Stolperstein: die Anzahl der Unicode-Zeichen in einem Text entspricht nicht zwangsläufig der Anzahl der Bytes, in denen er gespeichert ist — wer Textlängen oder Speicherplatz falsch abschätzt, weil er Zeichen mit Bytes verwechselt, produziert subtile Bugs bei Datenbank-Spaltenlängen oder Datei-Uploads mit Sonderzeichen.

Siehe auch: String