Uma lista de verificação para evitar problemas com caracteres internacionais em PHP e MySQL

A criação de sites, aplicativos ou sistemas de gerenciamento de conteúdo baseados em MySQL frequentemente envolve lidar com problemas desagradáveis ​​relacionados à codificação de caracteres que são difíceis (e, portanto, não divertidos) de diagnosticar. No pior dos casos, o comportamento pode até variar entre o ambiente de desenvolvimento e produção.

Nunca fui fundo o suficiente na codificação de caracteres (já que não é divertido), mas pretendo ler esta postagem de blog promissora recomendada em algum lugar no stackoverflow: Saindo do inferno do conjunto de caracteres do MySQL

Antes de começar a fazer isso (é bastante longa e detalhada), aqui está uma lista rápida de regras a serem seguidas que eu criei depois de muitas tentativas e erros. Posso atualizá-lo depois de ler o artigo.

A lista de verificação

  • O agrupamento do banco de dados deve ser definido como utf8_general_ci(ou qualquer coisa mais específica do idioma utf8_language_ci)
  • Cada coluna em cada tabela deve ter o mesmo agrupamento
  • A conexão com o banco de dados incluído em cada página PHP deve ser seguida por esta consulta MySQL: SET NAMES 'utf8' COLLATE 'utf8_general_ci'
  • O PHP deve fornecer um cabeçalho HTTP antes de qualquer saída, que especifica a codificação:header('Content-type: text/html; charset=utf-8');
  • O cabeçalho HTML deve especificar a codificação: <meta charset="UTF-8">
  • Cada arquivo PHP que exibe a saída deve ser salvo com a codificação de caracteres definida como UTF-8 sem BOM

Há um caso especial que precisa ser mantido em mente:

  • Sempre que cancelar a htmlentities()função do PHP , você deve especificar a codificação UTF-8

A fonte

Caso alguém esteja se perguntando, a questão stackoverflow que me trouxe ao post do blog está aqui , e a usuária Adrienne , autora da melhor resposta, lista estas regras:

  • A conexão DB está usando UTF-8
  • As tabelas do banco de dados estão usando UTF-8
  • As colunas individuais nas tabelas de banco de dados estão usando UTF-8
  • Na verdade, os dados são armazenados de forma adequada na codificação UTF-8 dentro do banco de dados (muitas vezes não é o caso se você importou de fontes incorretas ou alterou agrupamentos de tabelas ou colunas)
  • A página da web está solicitando UTF-8
  • Apache está servindo UTF-8