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.

EscritoExibidoOnde 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 em r?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 latin1 que guardam bytes UTF-8, ou um dump importado com o --default-character-set errado. As tabelas e a conexão devem usar utf8mb4.
Uma página web
Coloque <meta charset="utf-8"> em primeiro lugar no <head> e faça o servidor enviar Content-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.