Codificação de caracteres: Unicode e UTF-8 explicados
Atualizado 2026-07-06
Você já viu: um nome que deveria ser lido José aparece como José, ou um emoji vira uma caixa de pontos de interrogação. Essa bagunça tem nome — mojibake — e quase sempre é uma incompatibilidade de codificação de caracteres. Este guia explica o que caracteres, Unicode e UTF-8 realmente são, para que esses bugs deixem de ser um mistério.
Computadores guardam números, não letras
No nível mais baixo, um computador só guarda números (bytes). Para guardar texto, precisamos de uma tabela combinada que mapeie cada caractere para um número, e de volta. Essa tabela é uma codificação de caracteres. Se um programa escreve texto com uma tabela e outro o lê com uma tabela diferente, os números são interpretados como os caracteres errados — e você obtém mojibake.
ASCII: o pequeno começo
A codificação original e difundida, ASCII, definiu números para 128 caracteres: o alfabeto inglês, dígitos, pontuação e alguns códigos de controle. Suficiente para o inglês, mas sem espaço para é, ü, ß, 你, 😀 nem as dezenas de milhares de caracteres das línguas do mundo. Por décadas, cada um inventou suas próprias extensões incompatíveis, e é exatamente por isso que o texto quebrava ao cruzar entre sistemas.
Unicode: um número para cada caractere
Unicode é a solução universal: um único padrão que atribui um número único — chamado ponto de código (code point) — a cada caractere de cada sistema de escrita, mais símbolos e emoji. Os pontos de código são escritos como U+ seguido de um número hexadecimal:
A → U+0041 é → U+00E9 你 → U+4F60 😀 → U+1F600
Crucialmente, o Unicode define os números, mas não como guardá-los como bytes. Essa é uma decisão à parte — e é aí que entra o UTF-8.
UTF-8: como o Unicode vira bytes
UTF-8 é uma forma de codificar os pontos de código Unicode em bytes, e é a que a web usa de forma esmagadora. Seu design engenhoso é ser de comprimento variável:
- Os 128 caracteres ASCII ocupam 1 byte cada — então o UTF-8 é retrocompatível com o ASCII.
- A maioria dos caracteres latinos com acento e os gregos/cirílicos ocupam 2 bytes.
- A maioria das outras escritas, incluindo chinês, japonês e coreano, ocupam 3 bytes.
- Emoji e caracteres mais raros ocupam 4 bytes.
É por isso que uma string de «100 caracteres» nem sempre tem 100 bytes: um caractere pode ser vários bytes. Também explica o clássico bug José — são os bytes UTF-8 de é lidos por engano, um byte de cada vez, como uma codificação ocidental mais antiga.
Caracteres, pontos de código e bytes
Três conceitos relacionados mas diferentes fazem as pessoas tropeçarem constantemente:
- Caractere (Character) — o que um humano vê (a letra
é). - Ponto de código (Code point) — o número Unicode dele (
U+00E9). - Byte — como é guardado (em UTF-8, os dois bytes
0xC3 0xA9).
Ver um ponto de código escrito costuma ser a forma mais rápida de diagnosticar um problema de texto — por exemplo, um «espaço» que acaba sendo um espaço inquebrável (U+00A0). Nosso conversor Unicode mostra os pontos de código por trás de qualquer texto e converte entre caracteres e sequências de escape.
Como evitar o mojibake
- Use UTF-8 em todo lugar. Salve os arquivos como UTF-8 e declare — em páginas web,
<meta charset="utf-8">; em HTTP, o charset deContent-Type; em bancos de dados, uma collation UTF-8. - Mantenha consistente de ponta a ponta. A maior parte da corrupção acontece numa fronteira onde um lado assume uma codificação diferente.
- Faça escape para o contexto certo. Para colocar caracteres especiais com segurança em HTML, use entidades HTML; para colocá-los numa URL, use codificação de URL.
A versão curta: o Unicode dá a cada caractere um número, o UTF-8 transforma esses números em bytes, e se todos concordarem em usar UTF-8, o texto para de quebrar.
Mais de Formatos de dados & codificação
Ver todos os guias de Formatos de dados & codificação →Ferramentas mencionadas neste guia