Surrogate Pairs verstehen
Lernen wie UTF-16 represents Zeichen outside der BMP mit surrogate pairs, und warum dies matters.
问题
Ein single emoji oder rare Zeichen ist reported als two separate Code units, breaking Zeichenkette Länge und indexing.
Voraussetzungen
- Understanding of Unicode code points
- Familiarity with UTF-16
Schritte
-
1. Understand the BMP and beyond
The Basic Multilingual Plane (U+0000 to U+FFFF) covers most common characters. Characters above U+FFFF (like emoji) cannot fit in a single 16-bit code unit and require a surrogate pair in UTF-16.
Eingabe😀 = U+1F600输出above BMP, needs surrogate pair -
2. Compute the surrogate pair
Subtract 0x10000 from the code point, giving a 20-bit value. The high 10 bits plus 0xD800 form the high surrogate. The low 10 bits plus 0xDC00 form the low surrogate. For U+1F600, the pair is D83D DE00.
EingabeU+1F600输出high: D83D, low: DE00 -
3. Handle pairs in code
When iterating or indexing strings, account for surrogate pairs. A string's .length counts code units, not characters. Use code-point-aware APIs (like String.fromCodePoint and [...str]) to avoid splitting pairs.
Eingabe'😀'.length输出2 (code units), not 1
Erwartetes Ergebnis
Correct handling von Zeichen outside der BMP, mit kein teilen surrogate pairs oder incorrect Länge counts.
Häufige Fehler
- Splitting a string at an index that falls inside a surrogate pair
- Use code-point-aware iteration or check whether the code unit at the index is a low or high surrogate before splitting.
- String length is double the expected character count
- The string contains characters outside the BMP. Count code points, not code units, using a spread operator or iterator.
Troubleshooting指引
- If a character shows as two boxes, a surrogate pair was split. Rejoin them or use a UTF-8 representation.
- JavaScript strings are UTF-16; use Array.from(str) or [...str] to iterate by code point.
Sicherheitsgrenzen
- Surrogate pair bugs can cause truncation or misinterpretation of input, potentially bypassing length-based security checks.