Aller au contenu
uencoder

Comprendre Surrogate Pairs

Apprendre comment UTF-16 represents caractères outside le BMP utilisant surrogate pairs, et pourquoi ce matters.

问题

Un single emoji ou rare caractère est reported comme two separate code units, breaking chaîne longueur et indexing.

Prérequis

  • Understanding of Unicode code points
  • Familiarity with UTF-16

Étapes

  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.

    entrée
    😀 = 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.

    entrée
    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.

    entrée
    '😀'.length
    输出
    2 (code units), not 1

Résultat attendu

Correct handling de caractères outside le BMP, avec aucun diviser surrogate pairs ou incorrect longueur counts.

Erreurs courantes

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.

Dépannage指引

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

Limites de sécurité

  • Surrogate pair bugs can cause truncation or misinterpretation of input, potentially bypassing length-based security checks.

Outils associés

Termes associés

参考链接