EMZETT.
Login

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: "😀".length ist in JavaScript 2. Zerschneidet man mitten im Paar, entsteht ein ungültiges Zeichen. Array.from(s) oder for…of arbeiten 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