Os acentos voltam errados depois de gravar
Um registro de texto declara qual codificação ele usa, e uma ferramenta que grava uma enquanto outra supõe algo diferente produz acentos embaralhados na leitura. Os caracteres estão intactos na tag; o que está errado é o acordo sobre como interpretá-los.
O registro declara a codificação dele
Um registro de texto carrega mais que os caracteres. Ele carrega também uma indicação de como esses caracteres estão codificados, e um código de idioma.
Um leitor usa essa indicação para transformar bytes de volta em letras. Quando a declaração e a realidade concordam, os acentos voltam exatamente como foram gravados.
Quando elas divergem, os bytes estão intactos e a interpretação está errada, e é por isso que o resultado sai embaralhado em vez de ausente.
Caracteres fora da faixa latina sem acentos também custam mais de um byte cada, então um texto acentuado ocupa mais espaço do que o número de caracteres dele sugere.
Onde isso dá errado
Uma ferramenta de gravação que declara uma codificação e grava outra. A tag se contradiz então a si mesma e todos os leitores erram.
Uma ferramenta de leitura que ignora a declaração e supõe um padrão. A tag está correta e um leitor em particular a exibe mal.
Conteúdo colado de uma fonte em outra codificação, que pode chegar à ferramenta de gravação já embaralhado. A tag então guarda fielmente caracteres que estavam errados antes de chegar lá.
Leia a tag com uma segunda ferramenta para distinguir esses casos. Se dois leitores divergem, a tag está boa e um leitor está errado. Se os dois concordam que está errado, a tag guarda o que foi gravado.
Os endereços são um caso à parte
Um endereço da web não é texto livre. Os caracteres fora do conjunto permitido têm de ser codificados em porcentagem, e um endereço com caracteres acentuados brutos pode não funcionar mesmo estando guardado perfeitamente.
Algumas ferramentas os codificam por você e outras não, e é por isso que um endereço com caminho acentuado pode se comportar de forma diferente conforme o que o gravou.
Os nomes de domínio internacionalizados têm uma conversão própria, feita pelo navegador e não pela tag.
A tag guarda os caracteres fielmente em todos esses casos. O que varia é se o que foi guardado era um endereço válido.
Evitar o problema por completo
Use caracteres sem acento em tudo o que é gravado diretamente numa tag, onde o sentido sobreviver a isso. Não é elegante e remove uma classe inteira de falhas.
Mantenha o texto acentuado numa página em vez de numa tag, e grave um endereço curto. Uma página da web controla a própria codificação e se exibe corretamente em todo lugar.
Teste com o texto de verdade num celular que não seja aquele com que você gravou, já que uma ferramenta de gravação que relê o que ela mesma produziu pode esconder uma divergência.
E confira o comprimento depois de qualquer mudança em conteúdo acentuado, porque esses caracteres custam mais de um byte e uma mensagem que cabia pode deixar de caber.
Perguntas frequentes
A tag está guardando os caracteres errados?
Em geral não. Os bytes estão intactos e a interpretação está errada, e é por isso que o resultado sai embaralhado em vez de vazio.
Os acentos ocupam mais espaço?
Sim. Caracteres fora da faixa latina sem acentos custam mais de um byte cada, então um texto acentuado é maior que o número de caracteres dele.
Por que dois aplicativos mostram o texto de forma diferente?
Porque um está respeitando a codificação declarada e o outro está supondo um padrão. Essa divergência é a falha.
Dá para pôr acentos numa URL na tag?
Eles precisam ser codificados em porcentagem para serem válidos, e não é toda ferramenta que faz isso por você. Um caminho sem acento evita a questão.