Pular para o conteúdo

Emoji conta como quantos caracteres

Depende de quem conta. Para você, um. Para o computador, de 1 a 15 — e a distância entre esses dois números é a bio que não salva, o SMS que vira três e o cadastro que devolve o seu apelido pela metade. Medimos os 3.944 emoji da versão 17.0 do Unicode para saber o tamanho do estrago.

A norma está do seu lado

Quem define emoji é o consórcio Unicode, no documento UTS #51, e ele resolve a discussão em uma frase: “All emoji sequences are single grapheme clusters: there is never a grapheme cluster boundary within an emoji sequence.” Toda sequência de emoji é um agrupamento de grafema só, e nunca existe fronteira dentro dela. Grafema é o nome técnico daquilo que a gente chama de caractere: o pedacinho que o cursor pula de uma vez e que o backspace apaga inteiro.

Quando o seu teclado precisa de cinco backspaces para apagar uma família, quem está errado é o teclado. Quando um campo diz que você gastou onze de cento e cinquenta e você digitou um emoji, quem está errado é o campo. A norma diz que é um. O resto deste artigo é sobre os lugares onde ela é ignorada, e sobre quanto isso custa.

Quanto pesa cada emoji, no catálogo inteiro

A tabela abaixo é o conjunto todo, agrupado pelo número de unidades UTF-16 que cada emoji ocupa. UTF-16 é a unidade do .length do JavaScript, que é o que roda na maioria dos campos de texto da internet.

Unidades UTF-16Quantos emojiFatiaQuem são
1601,5%os veteranos: ⭐ ☕ ⚡ ✨ ⚽
21.23431,3%a carinha comum, e o coração com seletor
3 a 41.03526,2%tecla, bandeira de país, joinha com tom de pele
5 a 71.07627,3%profissão com tom de pele, arco-íris
8 a 111413,6%família de três e de quatro
12 a 1539810,1%duas pessoas com dois tons de pele

Média de 5,09 unidades, mediana de 4 e máximo de 15. Em bytes, a média é 11,36 e o campeão come 35. Fonte: o arquivo de teste de emoji da versão 17.0, datado de 2025-08-04 e lido por script em 9 de agosto de 2026. Os totais por grupo batem, um a um, com a página de contagens oficial do Unicode.

Duas linhas merecem atenção. A primeira: só 60 emoji, de 3.944, custam uma unidade — são os veteranos, que já existiam como símbolo de tipografia antes de virarem emoji e por isso couberam na parte barata do Unicode. A última: 398 emoji custam de doze a 15 unidades cada um, o que é mais que a palavra “caracteres”.

Somando as faixas de três para cima, 67,2% do catálogo custa três ou mais. A regra de bolso de que “emoji vale dois” está errada para dois terços da lista.

De onde vem o peso

Emoji caro não é emoji grande. É emoji montado: três mecanismos do Unicode grudam pedaço em pedaço, e cada pedaço é cobrado.

MecanismoCódigoEm quantos emojiO que faz
Tom de peleU+1F3FB a U+1F3FF2.030 (51,5%)cola um modificador depois da pessoa, e o modificador custa 2 unidades
Juntador de largura zeroU+200D1.614 (40,9%)amarra dois emoji num só, e ele mesmo custa 1 — a família de quatro tem três juntadores
Seletor de variaçãoU+FE0F1.180 (29,9%)manda desenhar como emoji, e não como símbolo preto e branco

É por isso que o preço não se distribui por igual entre os assuntos. Gente custa caro, porque gente tem tom de pele, profissão, gênero e companhia — e cada uma dessas coisas é um pedaço colado com juntador.

GrupoQuantos emojiMédia de unidades UTF-16
Gente e corpo2.4186,76
Bandeiras2704,1
Objetos2662,14
Símbolos2241,92
Viagem e lugares2192,09
Carinhas e emoções1712,18
Bichos e natureza1602,11
Comida e bebida1312,05
Atividades852,01

O grupo “Gente e corpo” sozinho é 61,3% do catálogo, e custa 3,5 vezes a média do grupo “Símbolos”.

Os seis números de um emoji só

Cada linha abaixo é a mesma sequência medida de seis jeitos. As duas últimas colunas são as regras próprias de dois lugares que a gente já tinha desmontado no artigo dos limites: o peso dentro de um post do X e o custo dentro de uma mensagem de SMS.

EmojiCódigosGrafemasUTF-16BytesPeso no XNo SMS
Estrela111321
Carinha rindo112422
Coração sem o seletor111321
Coração vermelho212622
Tecla 1313723
Bandeira do Brasil214824
Joinha com tom de pele214824
Bandeira do arco-íris4161426
Cientista, tom claro4171527
Família de três5181828
Família de quatro711125211
Bandeira da Escócia711428214
Beijo com dois tons de pele1011535215

Nenhum número desta tabela foi digitado. A página guarda os pontos de código de cada sequência, monta o emoji e mede — as colunas de grafema, de peso no X e de SMS saem das funções do contador daqui, as mesmas que respondem quando você cola um texto lá. Se alguma delas parar de dizer que emoji é um grafema só, esta página não sobe.

A bandeira do Brasil é a letra B e a letra R

Não existe caractere de bandeira do Brasil no Unicode. O que existe são vinte e seis letras especiais, chamadas indicadores regionais, e a regra de que duas delas lado a lado viram a bandeira do país com aquela sigla. A nossa é o indicador B seguido do indicador R; a de Portugal é P e T. Por isso a bandeira custa 4 unidades: são duas letras, e cada uma dessas letras é cara.

A consequência aparece quando algum sistema corta pelo meio. Meia bandeira não é meia bandeira: é a letra B sozinha, que aparece como um quadradinho com um B dentro. E quando um aparelho não conhece aquela bandeira — o caso de território que virou bandeira depois de o celular sair da fábrica — ele mostra as duas letras lado a lado. Todo mundo já viu isso sem saber o que estava acontecendo.

O coração tem um caractere invisível dentro

O coração vermelho é o exemplo mais barato de um problema caro. O desenho vem de U+2764, que é um símbolo antigo de tipografia e, por isso, seria desenhado em preto e branco. Para virar emoji, ele vem com um segundo caractere colado, o U+FE0F, que não tem desenho nenhum: só serve para dizer “esse aí é para pintar”.

Resultado: o coração sem o seletor custa 1 unidade, e o coração de verdade custa 2 — o dobro, por causa de um caractere que ninguém vê e ninguém digitou. Ele está em 29,9% do catálogo. Se isso soa familiar, é porque é: é a mesma família de caractere invisível que o texto colado do Word carrega, e que quebra busca de planilha.

Cada linguagem conta de um jeito, e quase nenhuma conta certo

Rodamos as mesmas quatro sequências em cinco ambientes desta máquina, no mesmo dia. Nenhum deles está com defeito: cada um conta uma unidade diferente, com convicção, e chama todas de “caractere”.

EmojiVocêJavaScriptPythonRubySwiftPostgreSQLBytes
Estrela1111113
Bandeira do Brasil1422128
Família de quatro111771725
Beijo com dois tons de pele115101011035

Medido em 9 de agosto de 2026: Node 24.13.1, Python 3.14.4, Ruby 2.6.10, Swift 6.2.3 e PostgreSQL 17.9, este último num banco criado e apagado para o teste. Os números transcritos são conferidos no build contra a unidade que cada linguagem diz contar.

O Swift é o único da lista que responde o que uma pessoa responderia, porque é o único que decidiu que o tipo Character dele é um grafema. O Ruby sabe a resposta certa e não entrega por padrão: quem escreve .length recebe pontos de código, e quem escreve .grapheme_clusters.size recebe 1. O JavaScript é o mais distante de todos — e é ele que roda no campo onde você digita.

O SMS é onde isso vira dinheiro

A norma do SMS é dos anos 1990 e não previu nada disso. O 3GPP TS 23.038 diz que a mensagem no alfabeto padrão cabe em 160 caracteres, porque “in 140 octets, it is possible to pack (140x8)/7=160 characters”. E diz também que, quando a mensagem precisa de Unicode, ela passa a caber em “up to 140 octets, i.e. up to 70 UCS2 characters”.

O prejuízo, traduzido: “Bom dia” gasta 7 de 160. “Bom dia ” gasta 10 de 70 — o emoji não custou dois caracteres, custou dois caracteres e mais a metade do seu limite. Um beijo com dois tons de pele come 15 desses 70: cabem 4 numa mensagem, e o quinto já é outra mensagem, cobrada de novo.

E antes de culpar só o emoji: em português o acento faz o mesmo estrago. “Ate ja” cabe em 160 e “Até já” cabe em 70, porque o alfabeto padrão do SMS não tem “á” nem “é”. Quem escreve português já perde essa aposta na primeira palavra.

No X, todo emoji custa igual

O X é a única plataforma grande que publica a própria conta, na biblioteca twitter-text. O arquivo de configuração chama o limite de maxWeightedTweetLength — é peso, não caractere — e liga o reconhecimento de emoji, o que faz a sequência inteira contar como uma coisa só, com peso 2.

Isso dá uma consequência engraçada: a estrela, que custa 1 unidade em UTF-16, e o beijo com dois tons, que custa 15, pesam exatamente o mesmo lá dentro. Cabem 140 emoji num post, qualquer que seja o emoji. É a única tabela deste artigo em que o emoji caro sai de graça.

No Bluesky, dois limites correm juntos

O Bluesky declara os dois números no protocolo: até 300 grafemas e até 3.000 bytes. Quem chegar primeiro barra o post. Escrevendo em português, o de grafemas chega antes e o de bytes nunca aparece.

Com emoji caro, a ordem inverte: 85 beijos estouram os 3.000 bytes enquanto o contador de grafemas ainda marca 85 de 300. O post é recusado com o contador dizendo que sobra espaço, que é o pior tipo de erro: aquele em que a tela discorda do servidor.

No TikTok a unidade é UTF-16, escrita na documentação com essas palavras, então os 2.200 da legenda viram 146 beijos. Já a bio do Instagram não diz em que unidade conta: o número de 150 que todo mundo repete, este site incluído, não aparece em documento nenhum da Meta. Se ela contar UTF-16, cabem 10 beijos ali, e não 150.

O banco de dados corta no meio do emoji

Aqui a medição foi feita à mão, num PostgreSQL 17.9 criado só para isso. A documentação promete que “both of these types can store strings up to n characters (not bytes) in length”, e cumpre — só que, para ele, caractere é ponto de código. Um campo varchar(10) guarda dez carinhas ou um beijo com dois tons de pele, que sozinho ocupa os 10 pontos de código do campo inteiro.

Passar do tamanho num INSERT dá erro, e esse é o comportamento bom: value too long for type character varying(5). O problema é a conversão, que corta calada — e corta contando ponto de código, sem saber que existe um emoji ali dentro. Foi isto que o banco devolveu:

EntrouCampoSaiuVirou
Família de quatrovarchar(5)uma família de três — o menino sumiu
Família de quatrovarchar(3)um casal
Família de quatrovarchar(2)um homem e um juntador solto, que não junta mais nada
Bandeira do Brasilvarchar(1)a letra B sozinha, que é meia bandeira
Beijo com dois tons de pelevarchar(5)uma pessoa e um coração — o par foi embora

Repare na terceira linha. Cortando a família de quatro em dois pontos de código, sobra um homem e um juntador que não junta mais nada: um caractere invisível grudado no fim do seu campo, que vai atrapalhar a próxima busca e não vai aparecer em tela nenhuma.

O MySQL tem a versão mais antiga do mesmo problema, e ela ainda está viva em muito sistema brasileiro: o conjunto utf8mb3 guarda no máximo três bytes por caractere e, nas palavras da própria documentação, “supports BMP characters only (no support for supplementary characters)”. Emoji é justamente o que está fora desse pedaço. O campo não corta: ele recusa a linha inteira. A recomendação oficial é direta — “the recommended character set for MySQL is utf8mb4. All new applications should use utf8mb4” — e o utf8mb3 está marcado como depreciado, para sair numa versão futura.

Como contar do jeito que a pessoa conta

O navegador sabe fazer isso desde abril de 2024, quando o último dos grandes passou a trazer o Intl.Segmenter. Pedindo a granularidade de grafema, ele devolve os pedaços do jeito que o olho enxerga, e aí basta contar quantos são. É o que o contador daqui faz, e é por isso que ele responde 1 para a família de quatro enquanto o .length responde 11.

Ele também não finge que grafema é a resposta para tudo. Quando o destino é o X, a ferramenta troca de unidade e usa a conta de peso publicada por eles; quando é SMS, ela verifica se o texto ainda cabe no alfabeto antigo e mostra 160 ou 70 conforme o caso. Um contador que só sabe uma unidade está errado em algum lugar por definição.

O que esta medição não cobre

Medimos o conjunto recomendado para intercâmbio, que é o que os teclados oferecem. Fora dele existem combinações válidas que ninguém desenhou: custam ainda mais caro em unidade e aparecem quebradas em pedaços na tela, o que ao menos é um aviso visual de que aquilo passou do que a plataforma conhece.

A contagem por grafema depende da tabela Unicode instalada na máquina. A nossa rodou com a mesma versão 17.0 do arquivo lido, e por isso fechou em 1 nos 3.944; um celular de 2019 vai dividir em dois os emoji que ele não conhece, e vai contar dois. Não é divergência de opinião, é atraso de tabela.

E o principal: o que cada plataforma faz por dentro é o que ela quiser. X, TikTok e Bluesky publicam a unidade que usam, e por isso as três linhas deste artigo sobre eles têm fonte. Instagram, WhatsApp e LinkedIn não publicam — o que está escrito aqui sobre a bio é uma conta condicional, e continua condicional até alguém publicar o número.

Para ver isso no seu próprio texto, cole no contador: ele mostra a contagem por grafema e, ao lado, se aquilo cabe em cada lugar pela regra de cada lugar. É a mesma conta que fez as tabelas desta página.