DevWebPHP
Image
05/05/2020

Acentuação no PHP: Resolva de uma vez por todas!

# Como resolver de uma vez por todas os acentos no PHP

Todo programador PHP já passou por isso, desde o iniciante até o mais avançado: por alguma razão os acentos aparecem todos errados. Para sanar todas as dúvidas, segue os motivos e as soluções:

# Banco de dados

Especifique o conjunto de caracteres utf8mb4 em todas as tabelas e colunas de textos em seu banco de dados. Isso faz com que o MySQL grave e leia os valores codificados nativamente em UTF-8.

Em versões do MySQL menores que 5.5.3, você terá que usar o utf8 que só suporta um subconjunto dos cartecteres Unicode.

# Acesso aos dados

Nos códigos PHP, em qualquer método de acesso ao banco de dados, você terá que especificar o conjunto de caracteres para utf8mb4. Desta forma o MySQL irá converter do UTF-8 quando devolver e receber os dados do PHP.

Alguns drivers tem sua própria maneira para configurar o conjunto de caracteres, que modifica seu estado interno e informa o MySQL qual codificação usar na conexão.

  • Se você estiver usando a classe PDO do PHP com versão maior ou igual a 5.3.6, você pode especificar o conjunto de caracteres assim:
$pdo = new PDO('mysql:charset=utf8mb4');
1
  • Se você estiver usando mysqli, você pode usar a função set_charset():
$mysqli->set_charset('utf8mb4'); // orientado a objeto
mysqli_set_charset($link, 'utf8mb4'); // procedural
1
2
  • Se você ainda estiver usando as funções mysql, você pode usar mysql_set_charset().

Se o driver não provê seu próprio mecanismo para configurar o conjunto de caracteres, você pode executar um comando que diz ao MySQL qual codificação que você quer:

SET NAMES 'utf8mb4'
1

# Retornando do PHP:

  • Se sua aplicação fornece dados para outros sistemas, estes sistemas também terão que informar o conjunto de caracteres. Nas aplicações web, o navegador envia um header dizendo em qual codificação a requisição foi feita.

  • No PHP, você pode usar a opção default_charset do php.ini, ou enviar manualmente o header Content-Type, o que dá mais trabalho, mas o mesmo efeito.

  • Quando estiver enviando dados usando json_encode, adicione JSON_UNESCAPED_UNICODE no segundo parâmetro.

  • Se você estiver servindo html informe a codificação com a tag meta:

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
1

# Recebendo dados com PHP:

Infelizmente, você deve verificar cada string recebida como UTF-8 válido antes de gravar em qualquer lugar que seja. Para isso, use a função mb_check_encoding(), mas você terá que usá-la SEMPRE!. Isso é importante, pois, pessoas maliciosas podem enviar dados em qualquer codificação que quiserem.

# Outras considerações:

Obviamente, todos seus arquivos que o PHP estiver servindo, deverá estar na codificação UTF-8. Todo editor de código descente tem essa informação na barra de status.

É isso, espero ter ajudado!

Copyright © DevWebPHP 2020