Base de conhecimento

1000 perguntas frequentes, 500 tutoriais e vídeos explicativos. Aqui, você encontra apenas soluções!

Resolver um problema de codificação de páginas

Atualização 04/08/2026

Este guia destina-se a desenvolvedores e webmasters que encontram problemas na exibição de caracteres especiais (por exemplo, acentos, caracteres árabes, chineses, emojis, etc.), seja em um site Infomaniak ou em seu banco de dados.

 

Introdução

  • Causas frequentes de caracteres exibidos incorretamente que aparecem no lugar de caracteres especiais ou emojis como ??:
    • Conexão PHP em utf8 em vez de utf8mb4
    • Tabela ou coluna MySQL em latin1 ou utf8 em vez de utf8mb4
    • Arquivo SQL codificado de forma diferente do parâmetro de importação
    • Arquivos HTML/CSS/JS com codificação incorreta
    • Ausência ou declaração incorreta do charset no lado HTML, PHP ou HTTP
  • Soluções habituais:
    • Usar utf8mb4 em todos os lugares: base de dados, conexões, tabelas, colunas, arquivos, cabeçalhos
    • Validar a codificação de todos os arquivos e backups
    • Testar a exibição de emojis, acentos e outros caracteres multilíngues
  • Consulte também este outro guia para forçar uma codificação diferente ao conectar-se a um banco de dados MySQL.

 

Utilize um editor de texto que suporte o salvamento em UTF-8 sem BOM (Visual Studio Code, Sublime Text, Notepad++...)

 

1. Utilize UTF-8 ou UTF-8MB4 em todos os lugares

A codificação utf8 do MySQL não suporta caracteres de 4 bytes, como emojis. Estes serão exibidos como ??. Portanto, é necessário utilizar utf8mb4, que é uma implementação completa e verdadeira de UTF-8.

 

2. HTML – Declaração correta da codificação

No <head> das suas páginas HTML:

Certifique-se também de que os arquivos CSS/JS estão salvos em UTF-8 (sem BOM).

Assurez-vous aussi que les fichiers CSS/JS sont enregistrés en UTF-8 (sans BOM). 

 

3. PHP – Forçar UTF-8 ou UTF-8MB4

a) Cabeçalhos HTTP

```html header('Content-Type: text/html; charset=utf-8'); ```

b) Conexão MySQL (API MySQL)

b) Connexion MySQL (API MySQL)

$connection = mysql_connect($host, $user, $pass);
mysql_set_charset('utf8mb4', $connection);

c) Conexão PDO

 $dsn = "mysql:host=localhost;dbname=ma_base;charset=utf8mb4";
$pdo = new PDO($dsn, $user, $pass, [
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
]);

 

4. Banco de dados MySQL

a) Configuração no phpMyAdmin

  • O banco de dados, as tabelas e as colunas devem estar em utf8mb4_unicode_ci ou utf8mb4_general_ci.
  • Na guia Operações, escolha utf8mb4_unicode_ci para o agrupamento.

b) Comandos SQL úteis

ALTER DATABASE ma_base CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
ALTER TABLE ma_table CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

c) Após a conexão PHP

mysqli_query($conn, "SET NAMES 'utf8mb4'");
mysqli_query($conn, "SET CHARACTER SET 'utf8mb4'");

 

5. Ficheiro .user.ini / .htaccess

Para forçar a codificação no lado do servidor (Apache):

AddDefaultCharset utf-8
Header set Content-Type "text/html; charset=utf-8"
# Para PHP
php_value default_charset UTF-8
php_value mbstring.internal_encoding UTF-8

 

6. Importação/exportação de arquivos SQL

Erros como é sendo substituído por ? ou um emoji ☺ sendo substituído por ?? geralmente são causados por um desalinhamento de codificação.

Verifique a codificação do arquivo SQL antes de importar. Use iconv, se necessário:

iconv -f ISO-8859-1 -t UTF-8 dump.sql > dump_utf8.sql

No phpMyAdmin, especifique a codificação da importação (por exemplo, UTF-8, UTF-8MB4 ou latin1, dependendo do arquivo).


Esta seção de perguntas frequentes foi útil?