Corretor de caracteres estranhos
Quando é vira é e o apóstrofo vira ’, as letras quase nunca se perderam. Algum programa as leu com a tabela de caracteres errada. Cole o texto e nós o lemos de novo do jeito certo.
Texto reparado
reparado melhor palpite, confira perdido, digite de novo · Aponte para uma palavra destacada, ou toque nela, para ver os caracteres originais.
O reparo é feito no seu navegador. Seu texto não é enviado para lugar nenhum.
Uma letra, duas formas de ler
Um arquivo não contém letras. Contém números chamados bytes, e uma codificação é a tabela que diz qual número representa qual caractere. Quase tudo o que se escreve hoje usa UTF-8, em que letras simples ocupam um byte, letras acentuadas ocupam dois e sinais tipográficos como aspas curvas ou o símbolo do euro ocupam três.
Windows-1252 é uma tabela mais antiga em que cada caractere tem exatamente um byte. Entregue um texto UTF-8 a um programa que o lê com essa tabela antiga e cada byte sai como um caractere separado. Os dois bytes de é (C3 A9) aparecem como à e ©. O estrago tem um nome emprestado do japonês, mojibake, e você provavelmente já o viu de uma destas formas.
| Escrito | Exibido | Onde aparece |
|---|---|---|
| é è | é è | café, crème |
| ü ö ß | ü ö ß | Zürich, Köln, Straße |
| ñ | ñ | señor, España |
| ã ç | ã ç | São Paulo, ação |
| ø å | ø Ã¥ | København, Århus |
| ’ “ — | ’ “ — | don’t, falas entre aspas, travessões |
| € | € | preços |
Como o conserto é feito
A ferramenta percorre o seu texto e para em cada sequência de caracteres da metade superior do Windows-1252. Ela transforma cada um de volta no byte de onde veio e depois verifica se esses bytes formam um caractere UTF-8 válido.
Válido quer dizer um byte inicial entre C2 e F4 seguido do número certo de bytes de continuação (80 a BF), sem formas longas demais, sem valores substitutos (surrogates). Se formam, a sequência é trocada pelo caractere que ela codifica. Se não formam, nada muda. Esse teste também é o que protege um texto escrito corretamente. O é de um “café” saudável é um único byte em Windows-1252, e um único byte nunca passa por um par UTF-8.
Um texto que foi danificado, salvo e danificado de novo mostra cadeias mais longas, como é. A ferramenta repete a passagem até cinco vezes, tirando uma camada por vez, até o texto parar de mudar.
Como ler os três destaques
- Consertado
- Os bytes foram decodificados sem problema, então essas mudanças são seguras. Passe o cursor sobre a palavra para ver o que ela substituiu.
- Palpite, confira
- Faltava um byte e a ferramenta preencheu a lacuna. São dois casos.
Ãseguido de um espaço é lido comoà, porque o segundo byte dessa letra (A0) também é o espaço não separável e muitas vezes vira um espaço comum. Umâ€sozinho é lido como aspas curvas de fechamento, porque o terceiro byte (9D) não tem caractere no Windows-1252 e costuma sumir. A ferramenta só arrisca esses palpites quando o texto mostra outros sinais claros de mojibake. - Perdido, digite de novo
- Um
�, ou um ponto de interrogação preso entre duas letras, como emr?sum?. Algum programa substituiu o caractere antes de salvar e não sobrou nenhum byte para decodificar. A ferramenta marca o lugar e você coloca a letra.
Um  solto antes de um espaço é a primeira metade de um espaço não separável. A ferramenta o remove e mostra o espaço que fica com uma marca discreta, para você distingui-lo de um espaço normal.
Corte o problema na origem
Consertar texto colado só trata o sintoma. Em algum ponto anterior, um programa grava em UTF-8 e outro não foi avisado. Estes são os lugares de sempre.
- Um CSV aberto no Excel
- Clique duas vezes num CSV e o Excel supõe a velha tabela do Windows. Em vez disso, vá em Dados, De Texto/CSV, e defina a Origem do arquivo como
65001: Unicode (UTF-8). Ao exportar, escolha “CSV UTF-8 (delimitado por vírgulas)”. - Um banco de dados MySQL ou MariaDB
- Colunas declaradas
latin1que guardam bytes UTF-8, ou um dump importado com o--default-character-seterrado. As tabelas e a conexão devem usarutf8mb4. - Uma página web
- Coloque
<meta charset="utf-8">em primeiro lugar no<head>e faça o servidor enviarContent-Type: text/html; charset=utf-8. - Um e-mail ou um arquivo de texto
- No e-mail, o cabeçalho
Content-Type: text/plain; charset=UTF-8. Nos arquivos, salve em UTF-8 pelo menu “Salvar com codificação” do editor.
Converter um banco de dados inteiro não é o mesmo trabalho que consertar um parágrafo. Faça um backup completo, rode a conversão numa cópia e compare as linhas antes de mexer no site no ar. Uma conversão aplicada a um texto que já estava correto o estraga.
O que não dá para recuperar
A ferramenta trata de um acidente, que por acaso é de longe o mais comum: UTF-8 lido como Windows-1252 ou Latin-1. Qualquer idioma é coberto, grego e cirílico inclusive, desde que a confusão tenha sido essa. Outros pares ficam de fora, como Mac Roman (em que é aparece como √©), Windows-1251 e Shift-JIS. O palpite que transforma à mais um espaço em à serve para o italiano, o português e outros idiomas que usam essa letra como palavra. Em qualquer outro texto, confira.
Perguntas frequentes
Por que é aparece como é?
O texto foi salvo em UTF-8, em que é ocupa dois bytes, e depois aberto como Windows-1252, em que cada byte é um caractere. Os dois bytes são exibidos como à e ©. Nada se perde nessa etapa, e é por isso que dá para desfazer.
O que significa ’ no meu texto?
É um apóstrofo curvo (’). Esse sinal ocupa três bytes em UTF-8 e cada um foi exibido separadamente. O mesmo acidente transforma aspas de abertura em “ e travessões em —.
Por que aparece um  antes de espaços ou antes de £?
O espaço não separável são os dois bytes C2 A0 e o símbolo da libra é C2 A3. Lido com a tabela errada, o primeiro byte vira um  visível. A ferramenta o remove e mantém o caractere que vem depois.
Ela corrige pontos de interrogação e losangos pretos (�)?
Não. Eles aparecem quando um programa não conseguiu representar um caractere e o substituiu antes de salvar, então os bytes originais sumiram. A ferramenta destaca cada um e você digita de novo.
Como corrijo caracteres estranhos em um site WordPress inteiro?
Verifique se DB_CHARSET no wp-config.php é utf8mb4 e se as tabelas não usam um collation latin1. Se forem só algumas páginas, cole cada texto aqui e coloque a versão consertada de volta. Para o banco inteiro, faça converter as tabelas primeiro numa cópia, com um backup em mãos.
O texto que eu colo é enviado a um servidor?
Não. Um script no seu navegador faz a decodificação e a página não faz nenhuma requisição com o seu texto.