Comprender Surrogate Pairs
Aprender cómo UTF-16 represents caracteres outside el BMP usando surrogate pairs, y por qué este matters.
问题
Un single emoji o rare carácter es reported como two separate código units, breaking cadena longitud y indexing.
Requisitos previos
- Understanding of Unicode code points
- Familiarity with UTF-16
Pasos
-
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.
entrada😀 = 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.
entradaU+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.
entrada'😀'.length输出2 (code units), not 1
Resultado esperado
Correct handling de caracteres outside el BMP, con no dividir surrogate pairs o incorrect longitud counts.
Errores comunes
- 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.
Solución de problemas指引
- 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.
Límites de seguridad
- Surrogate pair bugs can cause truncation or misinterpretation of input, potentially bypassing length-based security checks.