24 de octubre de 2022

Unicode, String internals

Conocimiento avanzado

Esta sección ahonda en los interioridades de los string. Este conocimiento será útil para ti si planeas lidiar con emojis, raros caracteres matemáticos, jeroglíficos, u otros símbolos extraños.

Como ya mencionamos, los strings de JavaScript están basados en Unicode: cada carácter está representado por una secuencia de entre 1 y 4 bytes.

JavaScript nos permite insertar un carácter en un string por medio de su código hexadecimal Unicode, usando estas tres notaciones:

  • \xXX

    XX deben ser dos dígitos hexadecimales con un valor entre 00 y FF. Entonces, \xXX es el carácter cuyo código Unicode es XX.

    Como la notación \xXX admite solo dos dígitos hexadecimales, puede representar solamente los primeros 256 caracteres Unicode.

    Estos primeros 256 caracteres incluyen el alfabeto latino, la mayoría de caracteres de sintaxis básicos, y algunos otros. Por ejemplo, "\x7A" es lo mismo que "z" (Unicode U+007A).

    alert( "\x7A" ); // z
    alert( "\xA9" ); // ©, el símbolo de copyright
  • \uXXXX XXXX deben ser exactamente 4 dígitos hexadecimales con un valor entre 0000 y FFFF. Entonces, \uXXXX es el carácter cuyo código Unicode es XXXX.

    Caracteres con un valor Unicode mayor que U+FFFF también pueden ser representados con esta notación, pero en ese caso necesitamos usar los llamados “pares sustitutos”, descritos más adelante.

    alert( "\u00A9" ); // ©, lo mismo que \xA9, usando la notación de 4 dígitos hexa
    alert( "\u044F" ); // я, letra del alfabeto cirílico
    alert( "\u2191" ); // ↑, símbolo flecha
  • \u{X…XXXXXX}

    X…XXXXXX debe ser un valor hexadecimal de 1 a 6 bytes entre 0 y 10FFFF (el mayor punto de código definido por Unicode). Esta notación nos permite fácilmente representar todos los caracteres Unicode existentes.

    alert( "\u{20331}" ); // 佫, un raro carácter chino
    alert( "\u{1F60D}" ); // 😍, un símbolo de cara sonriente

Pares sustitutos

Todos los caracteres frecuentes tienen códigos de 2 bytes (4 dígitos hexa). Las letras de la mayoría de los lenguajes europeos, números, los conjuntos básicos de caracteres ideográficos CJK unificados (CJK: de los sistemas chino, japonés y coreano), tienen un representación de 2 bytes.

Inicialmente, JavaScript estaba basado en la codificación UTF-16 que solo permite 2 bytes por carácter. Pero 2 bytes solo permiten 65536 combinaciones y eso no es suficiente para cada símbolo Unicode posible.

Entonces, los símbolos raros que requieren más de 2 bytes son codificados con un par de caracteres de 2 bytes llamado “par sustituto”.

Como efecto secundario, el largo de tales símbolos es 2: