Zum Inhalt springen
uencoder

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. 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. 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.

    Eingabe
    U+1F600
    输出
    high: D83D, low: DE00
  3. 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.

Verwandte Tools

Verwandte Begriffe

参考链接