Armazenamento de dados :
-
Especifique outf8mb4
conjunto de caracteres em todas as tabelas e colunas de texto em seu banco de dados. Isso faz com que o MySQL armazene fisicamente e recupere valores codificados nativamente em UTF-8. Observe que o MySQL usará implicitamenteutf8mb4
codificação se umutf8mb4_*
agrupamento é especificado (sem qualquer conjunto de caracteres explícito).
-
Nas versões mais antigas do MySQL (<5.5.3), infelizmente você será forçado a usar simplesmenteutf8
, que oferece suporte apenas a um subconjunto de caracteres Unicode. Eu gostaria de estar brincando.
Acesso a dados :
-
No código do seu aplicativo (por exemplo, PHP), em qualquer método de acesso ao banco de dados usado, você precisará definir o conjunto de caracteres de conexão parautf8mb4
. Dessa forma, o MySQL não faz conversão de seu UTF-8 nativo quando transfere dados para seu aplicativo e vice-versa.
-
Alguns drivers fornecem seu próprio mecanismo para configurar o conjunto de caracteres de conexão, que atualiza seu próprio estado interno e informa ao MySQL sobre a codificação a ser usada na conexão—esta é geralmente a abordagem preferida. Em PHP:
-
Se você estiver usando o PDO camada de abstração com PHP ≥ 5.3.6, você pode especificarcharset
no DSN :
$dbh = new PDO('mysql:charset=utf8mb4');
-
Se você estiver usando o mysqli , você pode chamarset_charset()
:
$mysqli->set_charset('utf8mb4'); // object oriented style mysqli_set_charset($link, 'utf8mb4'); // procedural style
-
Se você está preso com o mysql simples mas por acaso estiver executando o PHP ≥ 5.2.3, você pode chamarmysql_set_charset
.
-
-
Se o driver não fornecer seu próprio mecanismo para definir o conjunto de caracteres de conexão, você pode ter que emitir uma consulta para informar ao MySQL como seu aplicativo espera que os dados na conexão sejam codificados:SET NAMES 'utf8mb4'
.
-
A mesma consideração em relação autf8mb4
/utf8
aplica-se como acima.
Saída :
-
Caso seu aplicativo transmita texto para outros sistemas, eles também precisarão ser informados sobre a codificação de caracteres. Com aplicativos da web, o navegador deve ser informado sobre a codificação em que os dados são enviados (através de cabeçalhos de resposta HTTP ou metadados HTML ).
-
Em PHP, você pode usar odefault_charset
php.ini ou emita manualmente oContent-Type
cabeçalho MIME, o que é apenas mais trabalho, mas tem o mesmo efeito.
-
Ao codificar a saída usandojson_encode()
, adicioneJSON_UNESCAPED_UNICODE
como segundo parâmetro.
Entrada :
-
Infelizmente, você deve verificar cada string recebida como sendo UTF-8 válida antes de tentar armazená-la ou usá-la em qualquer lugar.mb_check_encoding()
do PHP faz o truque, mas você tem que usá-lo religiosamente. Não há realmente nenhuma maneira de contornar isso, pois clientes maliciosos podem enviar dados em qualquer codificação que quiserem, e não encontrei um truque para fazer com que o PHP faça isso para você de forma confiável.
-
Da minha leitura da atual especificação HTML , os seguintes sub-balas não são mais necessários ou mesmo válidos para HTML moderno. Meu entendimento é que os navegadores trabalharão e enviarão dados no conjunto de caracteres especificado para o documento. No entanto, se você estiver segmentando versões mais antigas do HTML (XHTML, HTML4 etc.), esses pontos ainda podem ser úteis:
- Somente para HTML antes de HTML5 :você deseja que todos os dados enviados a você pelos navegadores estejam em UTF-8. Infelizmente, se você for pela única maneira confiável de fazer isso é adicionar o
accept-charset
atribua a todos os seustags:
.
- Somente para HTML antes de HTML5 :observe que a especificação HTML do W3C diz que os clientes "devem" enviar formulários de volta ao servidor em qualquer conjunto de caracteres que o servidor serviu, mas isso aparentemente é apenas uma recomendação, daí a necessidade de ser explícito em cada
etiqueta.
- Somente para HTML antes de HTML5 :você deseja que todos os dados enviados a você pelos navegadores estejam em UTF-8. Infelizmente, se você for pela única maneira confiável de fazer isso é adicionar o
Outras Considerações sobre o Código :
-
Obviamente, todos os arquivos que você servirá (PHP, HTML, JavaScript, etc.) devem ser codificados em UTF-8 válido.
-
Você precisa ter certeza de que toda vez que processar uma string UTF-8, você o faça com segurança. Esta é, infelizmente, a parte difícil. Você provavelmente desejará fazer uso extensivo dombstring
extensão.
-
As operações de string integradas do PHP não por padrão, seguro UTF-8. Existem algumas coisas que você pode fazer com segurança com operações normais de string PHP (como concatenação), mas para a maioria das coisas você deve usar o equivalentembstring
função.
-
Para saber o que você está fazendo (leia:não estrague tudo), você realmente precisa saber o UTF-8 e como ele funciona no nível mais baixo possível. Confira qualquer um dos links de utf8.com para alguns bons recursos para aprender tudo o que você precisa saber.