Respuesta técnica directa
Un clúster de grafemas es una secuencia de uno o más puntos de código de Unicode que representa un único carácter percibido por el usuario en pantalla. El conteo de puntos de código falla con los caracteres compuestos (p. ej., e + acento agudo) y con los emojis (p. ej., secuencias ZWJ, tonos de piel, banderas).
Los cuatro niveles de representación del texto
Comprender el procesamiento de texto exige diferenciar las cuatro capas, desde el almacenamiento físico hasta la representación visual.
1. Bytes (octetos)
2. Unidades de código
3. Puntos de código
4. Clústeres de grafemas
Contar los caracteres percibidos por el usuario en texto compuesto y emojis
// 1. Combining mark: 'e' (U+0065) + combining acute (U+0301)
const accented = 'e\u0301';
console.log(accented.length); // 2 code units
console.log([...accented].length); // 2 code points
// 2. Woman Technologist: Woman + ZWJ + Laptop
const tech = '👩💻';
console.log(tech.length); // 5 code units
console.log([...tech].length); // 3 code points
// 3. User-perceived character counting via Intl.Segmenter
const segmenter = new Intl.Segmenter('en', { granularity: 'grapheme' });
console.log([...segmenter.segment(accented)].length); // 1 visual character!
console.log([...segmenter.segment(tech)].length); // 1 visual character!
2
2
5
3
1
1
Cómo funcionan las reglas de límites de los clústeres de grafemas
El UAX #29 de Unicode especifica reglas de ruptura basadas en máquinas de estados que determinan si dos puntos de código adyacentes permanecen unidos o se separan.
Regla GB9: no romper antes de los caracteres combinantes
Regla GB11: no romper dentro de las secuencias de emojis con ZWJ
Regla GB12/13: pares de indicadores regionales para las banderas
Errores comunes frente a patrones de producción
Aprenda qué patrones fallan en producción y cuáles son las alternativas modernas conformes con los estándares.
Invertir una cadena de forma segura
Utilidades de manipulación de texto, palíndromos, animaciones.'e\u0301'.split('').reverse().join('')
// Produces '\u0301e' — floating accent detached from base letter!
const seg = new Intl.Segmenter('en', { granularity: 'grapheme' });
const chars = Array.from(seg.segment('e\u0301'), s => s.segment);
chars.reverse().join('');
// Correctly keeps 'é' intact!
Matriz de casos límite e invariantes
Una matriz de pruebas diversa entre caracteres que compara el comportamiento de los caracteres en ASCII, marcas combinantes, emojis, banderas y fragmentos sustitutos.
| Caso de prueba | Glifo de entrada | Unidades de código | Puntos de código | Grafemas | Categoría | Explicación técnica |
|---|---|---|---|---|---|---|
| Carácter latino | Z |
—
|
1
|
1
|
ASCII | El punto de código único U+005A es 1 clúster de grafemas. |
| Carácter base + 2 caracteres combinantes | ö́ |
—
|
3
|
1
|
Multiple Combining Marks | Letra o + diéresis + acento agudo. 3 puntos de código forman 1 clúster visual. |
| Emoji con tono de piel | 👍🏽 |
—
|
2
|
1
|
Emoji Modifier | Pulgar hacia arriba (U+1F44D) + tono de piel medio (U+1F3FD). 1 clúster de grafemas. |
| Emoji de familia con ZWJ | 👩👩👦👦 |
—
|
7
|
1
|
ZWJ Sequence | Mujer + ZWJ + Mujer + ZWJ + Niño + ZWJ + Niño. 7 puntos de código forman 1 familia visual. |
Procedencia de estándares y fuentes
Todos los invariantes técnicos, las API y los comportamientos de esta guía se verifican contra las especificaciones primarias oficiales.
Unicode Standard Annex #29: Unicode Text Segmentation
Cláusula: §3 Grapheme Cluster Boundaries
Unicode Technical Standard #51: Unicode Emoji
Cláusula: §2.2 Emoji Sequences