Begriff
Unicode
Warum wichtig?
Dieser Begriff ist ein Knoten im SengakujiWorks-Wissensnetz. Nutze Level 0 für die erste Einordnung, Level 1 für Praxis, Level 2 für technische Struktur und Level 3 für Grenzen, Fallstricke und Expertenkontext.
Früher (ASCII) kannte der Computer nur 128 Zeichen (Englisch).
"Was ist mit 'ü' oder 'é' oder '字'?"
Chaos. Jeder hatte seine eigene Tabelle (Code Page).
Wenn du eine deutsche Email in Russland geöffnet hast, sahst du nur Buchstabensalat ("Mojibake").
Unicode ist die EINE Tabelle für ALLE Zeichen der Menschheit.
Jedes Zeichen hat eine Nummer (Code Point).
A = U+0041.
ü = U+00FC.
💩 = U+1F4A9.
Es gibt Platz für über 1 Million Zeichen (inklusive Klingonisch).
Dank Unicode versteht heute jedes Handy jede Sprache.
Merksatz: Ein internationaler Standard, der für fast jedes sinnvolle Schriftzeichen oder Textelement aller bekannten Schriftkulturen und Zeichensysteme einen eindeutigen digitalen Code festlegt.
Als Entwickler:
Nutze immer UTF-8 (das ist nicht das Gleiche wie Unicode, siehe dort).
Wenn du String-Length misst, pass auf:
"💩".length ist in JavaScript oft 2 (weil JS intern UTF-16 nutzt und das Emoji 2 "Hälften" braucht).
Nutze moderne Methoden: Array.from("💩").length === 1.
1. Code Point vs. Grapheme Cluster
Ein "Zeichen" ist kompliziert.
e + ´ (Akzent) = é.
Das sind 2 Code Points (U+0065 und U+0301).
Aber für den User ist es 1 Zeichen.
Das nennt man Grapheme Cluster.
Wenn du das string umdrehst (reverse), darfst du nicht die Code Points trennen, sonst landet der Akzent auf dem falschen Buchstaben.
2. Normalisierung (NFC vs NFD)
Es gibt zwei Arten, "n" zu schreiben:
- NFC (Composed): Ein fertiges Zeichen
ñ(U+00F1). - NFD (Decomposed): Ein
n(U+006E) gefolgt von der Tilde~(U+0303). Für den User sieht es gleich aus. Für den Computer sind die Bytes völlig verschieden."ñ" === "n~"ist FALSE. Du musst Strings vor dem Vergleich normalisieren:str.normalize('NFC').
3. Han Unification
Unicode hat versucht, Platz zu sparen, indem es chinesische, japanische und koreanische Zeichen (die oft gleich aussehen) auf dieselbe Nummer gemappt hat. Das führt bis heute zu Streit, weil sie in den verschiedenen Sprachen leicht unterschiedlich gemalt werden sollten (Font-Problem).
1. Die Ebenen (Planes)
Unicode ist in 17 "Ebenen" (Planes) unterteilt. Jede Ebene hat 65.536 Plätze.
- BMP (Basic Multilingual Plane - Ebene 0): Hier liegt fast alles, was wir täglich brauchen (Lateinisch, Kyrillisch, Hieroglyphen, Basis-Symbole). Code Points bis U+FFFF.
- Supplementary Planes (Ebenen 1-16): Hier wohnen die Emojis, historische Schriften (Keilschrift) und extrem seltene chinesische Zeichen. Der technische Unterschied: BMP-Zeichen passen in 2 Bytes (UTF-16), Supplementary-Zeichen brauchen 4 Bytes. Das sorgt in alten Programmen oft für Abstürze, wenn man ein Emoji (Ebene 1) eingibt, wo nur die BMP (Ebene 0) erwartet wurde.
2. RTL und Steuerzeichen (BiDi)
Unicode kann nicht nur Zeichen "malen", sondern auch den Textfluss steuern.
Es gibt unsichtbare Zeichen wie den RLO (Right-to-Left Override).
Hacker nutzen das für Dateinamen-Tricks:
Ein Dateiname sieht im Explorer aus wie rechnung_exe.pdf.
In Wahrheit sind die Bytes: rechnung_ [RLO] fdp.exe.
Der Browser sieht das RLO-Zeichen und dreht die Anzeige der restlichen Zeichen einfach um. Der User denkt, es sei ein PDF, führt aber eine EXE aus. Unicode-Sicherheit ist ein eigenes Fachgebiet.
3. Punycode (IDN)
Das Domain-Name-System (DNS) kann eigentlich nur ASCII (A-Z, 0-9).
Wie funktionieren dann URLs wie müller.de?
Durch Punycode. Der Browser wandelt das ü intern um.
müller.de wird zu xn--mller-kva.de.
Wenn du eine solche "XN--" Adresse siehst, ist das die ASCII-Darstellung eines Unicode-Namens. Dies ermöglichte die Einführung von Top-Level-Domains in anderen Schriften (z.B. .рф für Russland).
Quick-Check
Wie viele Zeichen gibt es?
Aktuell ca. 150.000 definiert. Platz ist für 1.114.112. Wir haben also noch Platz für Alien-Sprachen.Private Use Area?
Ein Bereich in Unicode (U+E000...), den Firmen für eigene Icons nutzen können (z. B. das Apple-Logo auf dem iPhone). Funktioniert nicht auf anderen Geräten.BOM (Byte Order Mark)?
U+FEFFam Anfang der Datei. Sagt dem Editor: "Ich bin Unicode". Bei UTF-8 eigentlich unnötig, aber Windows schreibt es oft trotzdem rein. Führt oft zu Bugs in PHP/Linux.