← Voltar ao blog

Como converter encoding ISO-8859-1 para UTF-8 em PHP sem corromper acentos

Converter ISO-8859-1 para UTF-8 no PHP corrompe acentos quando a conversão acontece no lugar errado. Veja o passo a passo que preserva os caracteres.


Se você trabalha com sistemas legados em PHP, provavelmente já enfrentou o problema de acentos corrompidos ao migrar de ISO-8859-1 para UTF-8. Este guia mostra como fazer a conversão corretamente.

O problema

Sistemas antigos (especialmente Firebird/InterBase) armazenam dados em ISO-8859-1. Quando você tenta exibir em UTF-8 sem conversão, os acentos viram caracteres estranhos.

Solução 1: mb_convert_encoding

$texto = mb_convert_encoding($texto, 'UTF-8', 'ISO-8859-1');

Solução 2: iconv

$texto = iconv('ISO-8859-1', 'UTF-8//TRANSLIT', $texto);

Solução 3: Para Firebird (conexão)

Ao conectar ao Firebird, especifique o charset:

$pdo = new PDO('firebird:dbname=localhost:/path/to/db.fdb;charset=ISO8859_1', $user, $pass);

Dica de SQL

Se precisar verificar quais registros têm encoding incorreto no banco:

SELECT nome FROM clientes WHERE nome CONTAINING 'Ã' OR nome CONTAINING '�'

Precisa gerar queries SQL para verificar encoding no seu banco? Use o Sqlify — descreva em português e receba a query pronta.

Conclusão

Sempre converta na camada de apresentação, nunca no banco. Mantenha o banco no charset original e converta na saída.