Ir para o conteúdo
Allin

Contar carateres contra um limite que outra pessoa definiu

Publicado a 10/08/2026 · 13 min de leitura · Ferramentas de texto e idioma

Daniel Okonkwo

Daniel OkonkwoProgramador front-end e redator de Tecnologia na Allin

Desempenho web · Formatos de ficheiro

Verificado a partir de 4 fontes

Ver perfil
Em resumo

«Carácter» não designa uma só coisa, e quem escreveu o limite decidiu qual sem lho dizer. O contador de frequência desta página percorre a cadeia com um iterador de pontos de código, portanto conta pontos de código Unicode. Cole-lhe o emoji da família e devolve cinco linhas que somam sete: quatro linhas para as quatro pessoas e uma linha para algo que não se vê de todo, o unificador de largura zero, com contagem 3. Essa mesma cadeia é 1 agrupamento de grafemas, 7 pontos de código, 11 unidades UTF-16 e 25 bytes UTF-8. Esses quatro números são o que quatro sistemas diferentes chamam o seu comprimento, pelo que uma caixa que diz 500 carateres admite 500 se contar grafemas, 71 se contar pontos de código, 45 se usar o .length do JavaScript ou o .length() do Java, e 20 se a coluna por trás forem 500 bytes. A ferramenta não imprime total; a coluna soma-a você, e os valores por omissão ignoram os espaços e unificam maiúsculas, e é por isso que «Merci beaucoup !» dá 11 linhas que somam 14 e não 16 carateres. O SMS é mais apertado. O protocolo transporta 140 octetos, que são 160 carateres do alfabeto GSM de 7 bits ou 70 em UCS-2, e descem para 153 e 67 assim que as mensagens são concatenadas. Um só carácter fora da tabela de 7 bits vira a mensagem inteira: basta uma plica tipográfica, basta qualquer emoji, e bastam os á í ó ú espanhóis ou os ã õ portugueses, porque a tabela por omissão simplesmente não os contém. As meta-descrições não se contam: os fragmentos são cortados pela largura representada, não pelo número de carateres.

Um emoji vale 1 carácter, ou 7, ou 11, ou 25, consoante quem conta. Qual deles o seu formulário, a sua base de dados e o seu gateway de SMS querem dizer — e um teste de uma só colagem para saber com qual está a lidar.

Quatro números para um só emoji

Pegue no emoji da família formado por um homem, uma mulher, uma rapariga e um rapaz. É uma só coisa no ecrã, uma só tecla de Retrocesso apaga-o e o cursor salta-o num só passo. Por baixo são quatro emojis de pessoas separados por três cópias de um carácter de controlo invisível, U+200D, o unificador de largura zero. Medida de quatro maneiras, essa cadeia é 1 agrupamento de grafemas, 7 pontos de código, 11 unidades UTF-16 e 25 bytes UTF-8. Nenhum desses números está errado; respondem a quatro perguntas diferentes.

O agrupamento de grafemas é o carácter tal como o utilizador o percebe, e o Unicode define as fronteiras entre eles num anexo técnico, o UAX n.º 29, precisamente porque «aquilo que um leitor considera um carácter» não é suficientemente óbvio para ser deixado a cada programa. O ponto de código é a entrada numerada do catálogo Unicode. A unidade UTF-16 é uma casa de dezasseis bits, e tudo o que passe de U+FFFF precisa de duas: é esse o número que JavaScript, Java e C# devolvem quando se pede o comprimento de uma cadeia. O byte UTF-8 é o que viaja mesmo pela rede e ocupa uma coluna de base de dados.

O que esta ferramenta conta, exatamente

O contador de frequência percorre a entrada com um ciclo for-of, que em JavaScript avança por pontos de código e não por unidades de dezasseis bits. Conta, portanto, pontos de código, e vê-se fazê-lo. Cole o emoji da família com as definições por omissão e a saída são cinco linhas: uma linha de aspeto vazio com a contagem 3 e depois quatro linhas com 1 cada. A linha vazia é o unificador de largura zero. Some a coluna e obtém 7, o número de pontos de código, não o 1 que responderia se lhe perguntassem quantos carateres colou.

Duas predefinições mudam a conta antes de a ver. «Ignorar espaços» está ligado, pelo que os espaços nunca aparecem na tabela: «Merci beaucoup !» tem 16 carateres mas produz 11 linhas que somam 14, porque os dois espaços caem. «Ignorar maiúsculas» também está ligado e funde pares, que é o que quase sempre se quer e de vez em quando produz algo estranho. O İ maiúsculo turco passa a minúscula como um i mais um ponto combinante à parte, pelo que a tabela ganha uma linha cuja chave mede dois pontos de código. A ferramenta nunca prometeu que a chave da linha fosse um único carácter; é o que a conversão para minúscula produziu.

E não imprime total. A saída é uma tabela de duas colunas, carácter e contagem, ordenada por contagem e depois alfabeticamente, e o número que provavelmente procurava é a soma da segunda coluna. Se quiser as quatro contagens lado a lado sem contas, o contador de bytes UTF-8 do site imprime grafemas, pontos de código, bytes UTF-8, unidades UTF-16, palavras e linhas de uma vez: existe justamente porque esses números divergem, e o próprio comentário do código o diz.

O teste de uma só colagem que revela com que contador está a lidar

Cole um emoji de família no campo com o contador e leia o contador. Se disser 1, conta agrupamentos de grafemas. Se disser 7, conta pontos de código. Se disser 11, usa o comprimento de cadeia nativo da linguagem, ou seja unidades UTF-16: JavaScript, Java ou C#. Se disser 25, está a contar bytes UTF-8 e o limite é, na verdade, um limite de bytes. Quatro respostas possíveis, quatro sistemas diferentes por trás do campo, e o teste cabe numa colagem.

O teste tem uma segunda metade, e pesa mais: o contador que vê no navegador não é necessariamente o que decide. Um contador de front-end é quase sempre o .length do JavaScript, ao passo que a recusa no envio vem de um servidor, de uma definição de coluna ou de uma API a jusante com o seu próprio critério. Se o campo o deixa escrever 500 e a gravação falha aos 480, as duas pontas contam de forma diferente e ganha a mais curta. Escreva o texto, grave, recarregue a página e veja o que voltou: um truncamento vê-se mais facilmente do que se prevê.

SMS: 160 carateres, ou 70, e quem decide é uma plica

O serviço de mensagens curtas transporta até 140 octetos de dados de utilizador. Empacote-os com o alfabeto GSM de 7 bits por omissão e cabem 160 carateres; codifique em UCS-2, dois bytes por unidade, e cabem 70. Quando uma mensagem é demasiado longa é partida, e cada parte cede espaço a um pequeno cabeçalho que diz qual parte é: sobram 153 carateres de 7 bits ou 67 unidades UCS-2 por segmento. Nada disto é negociável, e todas as tabelas de preços de SMS em massa assentam nisso.

O interessante é o que está nessa tabela de 7 bits, porque um só carácter que falte vira toda a mensagem para UCS-2 e reduz a capacidade a menos de metade. A tabela tem um conjunto generoso de acentos — è é ù ì ò à ä ö ü ñ å æ ø ß, mais Ä Ö Ü Ñ É Å Æ Ø Ç — além de ¡ ¿ § e alguns símbolos monetários. Não tem á, í, ó nem ú, e não tem ã nem õ. Portanto uma mensagem em espanhol com «está» ou «aquí», ou uma em português com «não», é uma mensagem de 70 carateres e não de 160, e nada no ecrã o diz a quem envia.

A especificação previu isto e define tabelas nacionais: o espanhol tem uma tabela de deslocamento simples, o português tem uma simples e uma de bloqueio. Um carácter de deslocamento simples custa duas das suas casas de 7 bits em vez de uma, e ambas as pontas têm de implementar o mecanismo. Na prática a maioria dos gateways não tenta e salta para UCS-2. Esse mesmo mecanismo de escape explica que um pequeno conjunto de símbolos correntes já custe duas casas cada um numa mensagem normal: o acento circunflexo isolado, as chavetas, os parênteses retos, a barra invertida, o til, a barra vertical e o sinal do euro vivem na tabela de extensão, não na principal. E a plica tipográfica que o seu processador de texto inseriu quando escreveu uma reta não está em nenhuma das duas.

A meta-descrição mede-se em píxeis, não em carateres

Todas as listas de verificação de SEO dão um intervalo de carateres para a meta-descrição. A documentação da Google não dá nenhum: diz que não há limite de comprimento, que o fragmento é gerado a partir da página e por vezes da descrição, e que os fragmentos são cortados para caber no resultado. Caber é questão de largura representada: uma descrição cheia de letras largas é cortada mais cedo do que outra com o mesmo número de carateres feita de letras estreitas, e o resultado móvel tem menos espaço do que o de computador.

A consequência prática não é abandonar um orçamento de carateres, mas deixar de o tratar como regra. Ponha o que tem de sobreviver na primeira metade da frase e depois verifique o resultado real em vez da contagem. E tenha presente que a Google reescreve frequentemente a descrição inteira quando julga que o conteúdo da página responde melhor à consulta: uma descrição truncada que nunca escreveu é um problema diferente de uma que escreveu.

Duas grafias da mesma palavra, dois comprimentos

Há uma última armadilha que nada tem a ver com emojis. A letra é pode ser um ponto de código, U+00E9, ou dois: um e simples seguido de um acento agudo combinante. São idênticas à vista, significam o mesmo e não medem o mesmo: 1 ponto de código e 2 bytes contra 2 pontos de código e 3 bytes. Quase todos os teclados produzem a primeira; alguns sistemas, alguns digitalizadores e muito texto copiado e colado produzem a segunda. Passe a forma decomposta pelo contador de frequência e sai em duas linhas, uma das quais um acento nu pousado sobre nada.

Se uma verificação de comprimento falha com um texto que parece do tamanho certo, é a primeira coisa a testar. Normalizar para a forma composta antes de contar resolve-o, e é uma só chamada em todas as linguagens que trazem uma biblioteca Unicode. Faça-o antes de contar, antes de armazenar e antes de comparar duas cadeias por igualdade: a mesma palavra em duas formas de normalização não é igual em nenhuma comparação de bytes.

Um emoji de família por cinco contadores, com o número que cada um declara
Unidade de contagemO emoji da família conta comoOnde a encontraQuantos cabem sob «500 carateres»
Agrupamentos de grafemas (UAX n.º 29)1O String.count do Swift; uma tecla de Retrocesso; a primeira linha do contador de bytes UTF-8500
Pontos de código Unicode7 — quatro pessoas mais três unificadoresO len() do Python 3; as runas do Go; o contador de frequência desta página71
Unidades de código UTF-1611O .length do JavaScript, o .length() do Java, o .Length do C# — quase todos os contadores de formulário no navegador45
Bytes UTF-825O len() do Go; uma coluna ou um cabeçalho medidos em bytes20
Unidades UCS-2 num segmento de SMS11Um segmento único de 70 unidades, ou 67 assim que as mensagens são concatenadas6 por segmento — o sétimo abre outra mensagem
Contador de frequência de carateresConte quantas vezes cada carácter aparece no seu texto.Experimentar a ferramenta

Perguntas frequentes

Porque é que a tabela de frequência tem uma linha em branco?
Porque um carácter que não se vê continua a ser um carácter, e o contador relata-o com honestidade. No emoji da família essa linha é U+200D, o unificador de largura zero, que aparece três vezes: é o que cola as quatro pessoas numa só imagem. Os seletores de variação comportam-se do mesmo modo: o pequeno U+FE0F que transforma um símbolo monocromático num emoji a cores é invisível e é contado. Uma linha em branco com um número ao lado é a ferramenta a dizer-lhe que o seu texto contém algo que não vê, que é exatamente o que convém saber antes de o colar num campo com limite.
Um só emoji corta mesmo o meu SMS a meio?
Mais do que a meio. Uma mensagem é codificada num só alfabeto de ponta a ponta, portanto um único carácter fora da tabela GSM de 7 bits força toda a mensagem para UCS-2 e a capacidade cai de 160 carateres para 70. Com os emojis é pior: tudo o que passe de U+FFFF ocupa duas unidades UCS-2, pelo que uma simples cara sorridente custa duas das suas 70 e o emoji da família custa onze. Seis desses emojis e uma palavra não cabem num só segmento. Se a sua fatura de SMS em massa subiu sem o texto crescer, procure uma plica tipográfica ou um acento que a tabela não leva antes de olhar para qualquer outro lado.
O meu formulário diz 500 carateres. Que 500 são?
Teste em vez de adivinhar. Cole um emoji de família e leia o contador: 1 significa agrupamentos de grafemas, 7 pontos de código, 11 unidades UTF-16, 25 bytes UTF-8. Em ASCII puro os quatro coincidem, e é por isso que a diferença só aparece quando um utilizador real cola um nome acentuado ou um emoji no campo. Se o formulário é seu, conte agrupamentos de grafemas para o número visível e valide contra o que a camada de armazenamento impõe mesmo, e depois fixe o limite visível no menor dos dois. Se não é seu, assuma a resposta mais pequena possível e deixe folga.
Um VARCHAR(500) de base de dados são quinhentos bytes ou quinhentos carateres?
Nas bases relacionais correntes o comprimento declarado é em carateres, não em bytes — mas os limites à volta são em bytes, e é aí que se cai. Uma linha tem um tamanho máximo em bytes, um índice tem um tamanho de chave máximo em bytes, e uma codificação de quatro bytes por carácter multiplica ambos. Resultado: a coluna aceita os seus 500 carateres e o índice recusa-se a ser criado. Os limites em bytes são mais frequentes fora da base: valores de cabeçalhos HTTP, cargas de filas de mensagens, chaves de armazenamento de objetos e imensas API de terceiros estão especificadas em bytes. Quando a documentação diz bytes, conte bytes.
Quantos carateres deve ter uma meta-descrição?
Não existe número documentado, e o que lhe deram foi medido em resultados de pesquisa, não publicado como regra. A orientação da Google é que as descrições não têm limite de comprimento, que os fragmentos são tirados da página tanto quanto da descrição, e que são cortados para caber — caber sendo questão de largura representada num arranjo que difere entre telemóvel e computador. O hábito útil é carregar o início: ponha o argumento, o número ou o elemento diferenciador na primeira oração e trate tudo o resto como dispensável. Depois olhe para o resultado real numa pesquisa a sério e ajuste pelo que vir.

Artigos que podem interessar-lhe

Todos os guias
ExplicaçãoDetetar o idioma de um texto e porque os textos curtos falhamMedido, não afirmado: 90 frases curtas reais em seis idiomas, nenhuma recusada e 68 certas — 76%, caindo para 64% abaixo de dezasseis letras. Quatro das respostas erradas voltaram com 100% de confiança.ExplicaçãoO que medem realmente os índices de legibilidade (e as três coisas que não veem)O Flesch Reading Ease e o nível Flesch-Kincaid contam sílabas e comprimento de frase. Mais nada. As duas fórmulas na íntegra, uma passagem pontuada de ponta a ponta e o truque da vírgula que oferece 3,9 anos de escolaridade sem mudar uma palavra.ExplicaçãoFrequência de palavras e lei de Zipf: contámos seis livros em seis línguas e ajustámos o decliveA palavra de posição n aparece cerca de 1/n vezes em relação à primeira. Contámos seis livros de domínio público, imprimimos posição × frequência, ajustámos log frequência contra log posição e obtivemos declives entre -1,02 e -1,08 nas seis línguas — e os dois pontos onde a lei falha.ExplicaçãoContagem de palavras: tempo de leitura e limitesUma contagem de palavras são palavras separadas por espaços. Eis como se conta, porque existem limites, como se traduz em páginas e tempo de leitura, e quando contam os caracteres.ExplicaçãoMaiúscula de frase e maiúscula de título: as regras mudam com a línguaAs maiúsculas de título inglesas têm três cortes diferentes consoante o manual de estilo. O português, o francês, o espanhol e o italiano não têm nenhum. O alemão capitaliza todos os substantivos. A ferramenta não sabe nada disto — eis exatamente o que faz.ExplicaçãoOnde uma linha pode quebrar: o algoritmo Unicode por trás de cada parágrafo ajustado«Quebrar nos espaços» falha na maioria dos sistemas de escrita. O UAX #14 dá a cada caráter uma classe de quebra de linha; procurámos as nossas no Unicode 17.0.0 e executámos uma implementação conforme sobre espaços inquebráveis, hifenes condicionais, espaços de largura zero, URL, japonês e tailandês.

Ferramentas relacionadas

Isto descreve o que estas ferramentas de texto fazem hoje, verificado executando as suas próprias funções sobre as entradas exatas aqui citadas. Quando uma ferramenta erra num caso, fica escrito em vez de suavizado, porque uma ferramenta imprevisível é pior do que uma cujos limites se conhecem. Nada disto é uma regra que ferramenta alguma seja obrigada a seguir: a capitalização, a contagem de carateres e a numeração de linhas são convenções, e essas convenções mudam consoante a língua, o manual de estilo e o programa que estiver do outro lado. Antes de passar qualquer uma delas por um texto que não possa voltar a escrever, passe primeiro por uma cópia e compare as duas pontas.

Fontes

Detetaste um erro neste artigo?