Quatro formas de contar a mesma string

Moyoutil calcula a contagem com espaços usando [...s].length, que conta pontos de código. s.length do JavaScript conta unidades UTF-16. A sequência tem quatro pontos de código de pessoas e três junções U+200D: sete no total. O comprimento UTF-16 é 11 e TextEncoder produz 25 bytes UTF-8.

const s = "👨‍👩‍👧‍👦";
[...s].length // 7
s.length // 11
new TextEncoder().encode(s).length // 25
Comparação de um grafema, sete pontos de código, onze unidades UTF-16 e vinte e cinco bytes UTF-8
Diagrama de cálculos executados. Os números usam unidades diferentes; as áreas não representam proporções. Mostra critérios de contagem, não a aparência do emoji.

ECMAScript: String iterator · WHATWG: TextEncoder

Limites do texto e da entrada

Unicode UAX #29 descreve limites de grafemas estendidos e regras que não dividem sequências emoji ZWJ. Intl.Segmenter com granularidade grapheme retorna um segmento neste exemplo. Um limite de grafema não garante a aparência nem as regras de todos os formulários.

const segmenter = new Intl.Segmenter("en", {
  granularity: "grapheme"
});
[...segmenter.segment(s)].length // 1

Unicode UAX #29: Grapheme Cluster Boundaries

Moyoutil não mostra contagens separadas de grafemas ou UTF-16. Cole a sequência no contador para verificar 7 com espaços, 7 sem espaços e 25 bytes UTF-8. Confira se o limite é de caracteres, bytes ou UTF-16 e verifique no destino. Remover junções muda a sequência original.

Perguntas frequentes

Todo emoji conta como sete caracteres?

Não. Este é o resultado da sequência familiar específica. Outros pontos de código produzem outras contagens. Uma string vazia tem zero pontos de código, unidades UTF-16, bytes UTF-8 e grafemas.