Cuando preguntas por la longitud de una cadena, la respuesta depende de lo que cuentes. El mismo texto puede tener un número distinto de caracteres visibles, puntos de código, unidades UTF-16 y bytes. Unicode lo explica.
Puntos de código
Unicode asigna a cada carácter un número llamado punto de código, que se escribe en hexadecimal con el prefijo U+. La letra A es U+0041, el signo del euro es U+20AC y los puntos de código llegan hasta U+10FFFF. Eso deja espacio para más de un millón de valores posibles, de los cuales hoy se ha asignado una parte.
Bytes en UTF-8
UTF-8 guarda cada punto de código en uno a cuatro bytes.
- U+0000 a U+007F: un byte (ASCII simple).
- U+0080 a U+07FF: dos bytes, que cubren las letras latinas acentuadas, el griego y el cirílico.
- U+0800 a U+FFFF: tres bytes, incluidos la mayoría de los alfabetos asiáticos y el signo del euro.
- U+10000 en adelante: cuatro bytes, incluidos la mayoría de los emojis.
Unidades UTF-16
JavaScript y Java guardan las cadenas en UTF-16. Los puntos de código hasta U+FFFF ocupan una unidad de 16 bits, mientras que los mayores usan dos unidades llamadas par sustituto. Por eso la propiedad length de una cadena de JavaScript cuenta un solo emoji como 2.
Los caracteres visibles no son puntos de código
Lo que una persona ve como un carácter es un grupo de grafemas, y puede estar formado por varios puntos de código. La letra e con acento agudo puede ser un único punto de código precompuesto, U+00E9, o la letra e seguida del acento combinante U+0301. Ambos se ven igual pero tienen longitudes distintas. Las banderas, las variantes de tono de piel y los emojis de familia son secuencias unidas con uniones de ancho cero invisibles.
Por qué importa
- Truncar una cadena por byte o por unidad UTF-16 puede partir un carácter por la mitad.
- Contar caracteres para un límite debería usar grupos de grafemas.
- Comparar texto puede requerir normalización para que las formas equivalentes coincidan.
Preguntas frecuentes
¿Cómo veo estos valores en mi texto? Pégalo en el inspector para obtener los recuentos de grafemas, puntos de código, unidades UTF-16 y bytes UTF-8, además del punto de código y las secuencias de escape de cada carácter.
¿Qué es un carácter combinante? Una marca que se une al carácter anterior, como un acento.

