Contar caracteres
Com espaços e sem espaços, além da contagem de bytes que o seu banco de dados e o seu gateway de SMS realmente medem. Aqui, um emoji conta como um caractere, porque é isso que ele é.
- Nunca armazenado
- Sem fila, sem espera
- Sem cadastro, sem marca d'água
0
Caracteres
o que uma pessoa vê
0
Sem espaços
espaços em branco excluídos
0
Palavras
qualquer idioma
0
Bytes UTF-8
o que um banco de dados conta
- LinhasComo um editor as numera
- 0
- FrasesNão se quebram em “Dr.” ou “etc.”
- 0
- ParágrafosBlocos separados por uma linha em branco
- 0
- Pontos de códigoO que o “.” de uma expressão regular captura
- 0
- Unidades UTF-16O que string.length informa no JavaScript
- 0
- Bytes UTF-8O que um limite VARCHAR e os cabeçalhos HTTP medem
- 0
- Tempo de leituraEm silêncio, a 238 palavras por minuto
- —
- Tempo de falaEm voz alta, a 150 palavras por minuto
- —
- Palavra mais longaEm caracteres, não em bytes
- —
- Palavra médiaUm indicador aproximado de legibilidade
- —
Comece a digitar e tudo se preenche. Experimente um emoji ou uma frase em chinês — os dois são contados como uma pessoa contaria, algo que a maioria dos contadores erra.
Como funciona
Cole ou digite
A contagem é atualizada enquanto você escreve. Nada fica armazenado.
Escolha a contagem que você precisa
Caracteres, caracteres sem espaços, code points ou bytes UTF-8 — cada um aparece com o que o utiliza.
Fique de olho no limite
Títulos de SEO, meta descriptions, segmentos de SMS e um campo de 255 bytes são todos acompanhados em relação ao que você escreveu.
Quatro números, porque “caractere” tem quatro significados
Pegue o emoji de uma família, ou um joinha com tom de pele. Uma pessoa vê um caractere. Ele é formado por vários code points unidos por conectores invisíveis, então uma expressão regular vê sete. O JavaScript guarda texto em unidades de 16 bits, e qualquer coisa fora do intervalo básico ocupa duas delas, então ele informa onze. Codificado em UTF-8 para uma coluna de banco de dados, ele ocupa vinte e cinco bytes. Nenhum desses números está errado e nenhum é a resposta — o certo depende inteiramente de quem está impondo o limite.
Então a pergunta prática é quem impôs o limite. Uma coluna de banco de dados declarada como VARCHAR conta bytes na maioria dos bancos, e é por isso que um campo que aceita 255 caracteres em inglês recusa bem menos caracteres em japonês. Um SMS tem 160 caracteres no seu próprio alfabeto de sete bits e cai para 70 por mensagem no instante em que um caractere fica fora dele — uma única aspa curva ou um emoji pode transformar uma mensagem em três. Um validador de formulário em JavaScript quase sempre conta unidades UTF-16, e é por isso que um campo que diz 280 caracteres pode recusar um texto aparentemente mais curto cheio de emojis.
A contagem do que o leitor vê é a mais difícil e é feita com a segmentação de texto do próprio navegador — o mesmo mecanismo que decide para onde o cursor vai quando você aperta a seta para a esquerda. Essa é a definição certa de “um caractere” para qualquer coisa que uma pessoa percebe, e ela resolve os casos que confundem contagens mais simples: uma letra acentuada escrita como letra-base mais um acento combinante conta como um, e agrupamentos em híndi e tailandês são contados do jeito que um leitor dessas escritas contaria.
Para um texto comum em inglês, os quatro números são idênticos, e é por isso que o problema fica invisível até deixar de ficar. Eles divergem em emojis, em caracteres acentuados e combinantes, em escritas não latinas e em símbolos matemáticos — e esses são exatamente os textos que fazem um campo ser truncado sem aviso no banco de dados três meses depois de ter sido criado.
Quando você precisa de outra coisa
No código, use uma função que conte o que você precisa, e não o tamanho padrão. Intl.Segmenter no JavaScript conta o que o leitor vê; strings do Python 3 contam code points, e len(s.encode("utf-8")) conta bytes; o PHP tem mb_strlen e strlen justamente para essa distinção. O padrão na maioria das linguagens é o que foi conveniente para a linguagem, que raramente é o que o seu limite quer dizer.
Quando o limite é um campo de banco de dados, a solução duradoura está na origem. Declarar uma coluna como utf8mb4 no MySQL, ou text no PostgreSQL, elimina toda uma categoria de bugs de truncamento — o antigo utf8 do MySQL é famoso por ter só três bytes por caractere e não conseguir guardar emoji nenhum. Contar com cuidado no formulário é um remendo para uma coluna que deveria ter sido declarada de outro jeito.
Perguntas frequentes
Meu texto fica armazenado em algum lugar?
Não. Nada fica armazenado e nenhuma requisição é feita, e tudo continua funcionando com a internet desconectada. Isso importa mais do que parece quando se trata de texto: o que as pessoas colam em um contador online são textos não publicados, minutas jurídicas, trabalhos de estudantes e documentos internos.
Por que existem quatro contagens de caracteres diferentes?
Porque “caractere” tem quatro significados diferentes, e a maioria das ferramentas só conhece um. O que VOCÊ vê como um caractere é um cluster de grafemas — “é”, “🎉” e até “👨👩👧👦” contam como um cada. O que o string.length do JavaScript informa são unidades de código UTF-16, em que aquele emoji de família vale 11. O que uma expressão regular reconhece são code points, em que ele vale 7. E o que uma coluna de banco de dados ou um cabeçalho HTTP mede são BYTES UTF-8, em que ele vale 25. Os quatro aparecem aqui, porque o que você precisa depende de quem está impondo o limite.
Quantos caracteres tem um emoji?
Um, aqui — porque é isso que ele é para quem lê, e é o que um limite de caracteres em uma plataforma moderna conta. Em outros lugares, pode ser 2, 7 ou 11: “👨👩👧👦” são quatro pessoas unidas por três caracteres invisíveis de junção, então são 7 code points e 11 das unidades que o string.length do JavaScript conta. Se um formulário recusou seu texto por ser longo demais quando ele parecia curto o bastante, geralmente é por isso, e a contagem de bytes nesta página mostra o tamanho real.
Por que meu texto de 200 caracteres não coube em um campo de 255 caracteres no banco de dados?
Porque o campo quase certamente limita BYTES, não caracteres. Em UTF-8, letras simples do inglês ocupam um byte cada, mas letras acentuadas ocupam dois, e chinês, japonês, árabe e emojis ocupam três ou quatro. Então 200 caracteres em japonês são 600 bytes. A contagem de bytes aparece aqui exatamente por isso — é o número que o seu banco de dados realmente verifica.
Por que um emoji derruba meu limite de SMS de 160 para 70?
Porque uma mensagem de texto usa um alfabeto compacto de 7 bits que comporta 160 caracteres — e esse alfabeto não tem emojis, nem aspas curvas, e quase nenhum acento. Um único caractere fora dele muda a mensagem INTEIRA para Unicode, e o limite cai para 70. Um apóstrofo curvo colado do Word faz isso tão facilmente quanto um emoji. É assim que uma mensagem curta é cobrada como três, e a página avisa no momento em que isso acontece.
Ele conta espaços?
Os dois números aparecem ao mesmo tempo, então você não precisa escolher. Quebras de linha e tabulações também contam como espaço em branco.
Bom saber: Quatro números, porque “caractere” tem quatro significados, e o que você precisa depende de quem está impondo o limite. Uma coluna VARCHAR de banco de dados conta bytes UTF-8, uma expressão regular conta code points, o JavaScript conta unidades UTF-16 e uma pessoa conta o que consegue ver. Eles divergem mais nos emojis.
Coloque esta ferramenta no seu site
Grátis para qualquer blog, página de turma ou artigo de ajuda. Cole um único trecho de código e seus visitantes podem usá-la direto na sua página.
Ferramentas relacionadas
Contador de palavras
Palavras, frases e tempo de leitura
Comparar textos
Veja exatamente o que mudou entre duas versões
Converter maiúsculas e minúsculas
MAIÚSCULAS, minúsculas, Iniciais Maiúsculas, camelCase e mais
Codificar Base64
Transforme texto ou um arquivo em Base64
Remover linhas duplicadas
Tire repetições, ordene e organize uma lista
Minificar HTML
Reduza o HTML sem quebrar a página