Contar caracteres: SMS, X, títulos do YouTube e emojis

Atualizado:

“Quantos caracteres tem isso?” tem mais de uma resposta, porque cada sistema conta uma coisa diferente: o que você vê, os pontos de código por trás ou os bytes necessários para enviar. Uma mão acenando 👋 é um caractere na tela e dois para o JavaScript; um SMS com uma única letra acentuada aceita 70 caracteres em vez de 160. Este guia explica as regras de onde saem essas contas.

O que é um “caractere”

O que você vê como um caractere, um grafema, pode ser vários pontos de código Unicode, e cada ponto de código, uma ou duas unidades UTF-16. A propriedade length do JavaScript conta unidades, por isso 👋 tem tamanho 2. O emoji de família 👨‍👩‍👧 é um grafema formado por cinco pontos de código (homem, junção, mulher, junção, menina) e oito unidades. Até “café” pode ter quatro ou cinco pontos de código, com o acento guardado à parte; a maioria dos sistemas normaliza para quatro.

Um bom contador conta grafemas, o que quem lê vê. Separar o texto em pontos de código ou usar Intl.Segmenter, como explica o MDN, chega lá; só o length, não.

Contador de caracteres

SMS: 160, 70, 153 e 67

Um SMS leva no máximo 140 bytes de texto. Com o alfabeto GSM, de 7 bits por caractere, são 160 caracteres; assim que um caractere fica de fora, a mensagem inteira passa para UCS-2, de 2 bytes por caractere, e cabem 70. Alguns caracteres GSM ocupam dois lugares porque precisam de um escape: € [ ] { } ^ ~ \ |.

Textos maiores são enviados em partes, e cada parte gasta 6 bytes num cabeçalho que diz ao celular como juntá-las, o que deixa 153 caracteres GSM ou 67 caracteres UCS-2 por parte.

MensagemCabe num SMSPor parte, se dividida
Só caracteres GSM160153
Pelo menos um caractere diferente (um emoji, ó, ã, ê)7067

Assim, 161 caracteres GSM precisam de 2 partes e 307 precisam de 3; com um emoji, 71 caracteres já precisam de 2. Os acentos do português são a armadilha comum: à, è, é, ì, ò e ù estão no alfabeto GSM, mas á, ó, ú, â, ê, ô, ã, õ e ç não, então um simples “não” faz a mensagem passar para 70.

Limites no X, no YouTube e no Google

OndeLimiteComo conta
Post no X280Alfabeto latino, grego, cirílico, árabe e a maioria dos outros 1; chinês, japonês e coreano 2; cada emoji 2, até uma família; cada link 23
Título de vídeo do YouTube100Caracteres
Descrição do YouTube5.000Caracteres
Meta description para o GoogleSem limiteO Google corta o trecho para caber na tela e muitas vezes escreve o próprio a partir da página

No X, um post em alfabeto latino pode usar os 280 caracteres, mas um em japonês só 140, e um link sempre custa 23, por maior que seja.

Por que dois contadores dão números diferentes

Perguntas frequentes

Por que meu SMS caiu para 70 caracteres?

Porque tem um caractere que não está no alfabeto GSM: um emoji, aspas curvas ou um acento como o de ã. A mensagem inteira é enviada então em UCS-2, onde cabem 70 caracteres, ou 67 por parte.

Por que o € conta como dois num SMS?

Ele está na tabela de extensão GSM, acessada com um caractere de escape, então ocupa dois dos 160 lugares. O mesmo vale para [ ] { } ^ ~ \ e |.

Espaços contam?

Num SMS, num post no X e num título do YouTube, sim: um espaço é um caractere como outro qualquer. O contador de caracteres mostra a contagem com e sem eles.

Qual deve ser o tamanho de uma meta description?

O Google não fixa limite, corta o trecho para caber na tela e muitas vezes escreve o próprio a partir da página. Coloque as palavras importantes primeiro, para que sobrevivam ao corte.

Por que o JavaScript diz 2 para um único emoji?

Porque o length conta unidades UTF-16, e a maioria dos emojis ocupa duas. Conte grafemas, por exemplo com Intl.Segmenter, e 👋 dá 1.

Referências

  1. 3GPP TS 23.040 — Technical realization of the Short Message Service (SMS)
  2. 3GPP TS 23.038 — Alphabets and language-specific information
  3. X Developer Platform — Counting characters
  4. YouTube Help — Edit video settings
  5. Google Search Central — Control your snippets in search results
  6. MDN Web Docs — String: length

Guias relacionados