UTF-16 und Surrogate-Paare
Kurz: UTF-16 speichert Unicode-Zeichen in 16-Bit-Einheiten. Zeichen außerhalb der ersten 65.536 brauchen zwei Einheiten, ein Surrogate-Paar.
Genauer: Java, JavaScript, C# und Windows rechnen intern mit UTF-16. Deshalb liefert die Länge eines Strings dort oft nicht die Zahl der sichtbaren Zeichen.
Im Detail
- Basis-Ebene (BMP): Code-Punkte U+0000 bis U+FFFF belegen eine Einheit.
- Surrogate-Paar: Ein Code-Punkt ab U+10000 (viele Emojis) wird in eine hohe (D800 bis DBFF) und eine tiefe Einheit (DC00 bis DFFF) zerlegt.
- Folge:
"😀".lengthist in JavaScript 2. Zerschneidet man mitten im Paar, entsteht ein ungültiges Zeichen.Array.from(s)oderfor…ofarbeiten pro Code-Punkt. - Byte-Reihenfolge: UTF-16LE und UTF-16BE, oft mit BOM (Byte Order Mark) am Dateianfang.
- Gegen UTF-8: UTF-8 ist ASCII-kompatibel und im Web Standard. UTF-16 spart bei vielen CJK-Texten kaum.
- Noch feiner: Ein sichtbares Zeichen kann aus mehreren Code-Punkten bestehen (Graphem-Cluster, zum Beispiel Flaggen oder Hautfarb-Emojis).
Siehe auch: UTF-8 und Zeichenkodierung