Pergunta

Muitas vezes acontece que personagens como E se transforma a à © , mesmo que o agrupamento de banco de dados MySQL, a tabela eo campo está definido para utf8_general_ci. A codificação no Content-Type para a página também está definida para UTF8.

Eu sei sobre utf8_encode / decodificação, mas eu não estou muito certo sobre onde e como usá-lo.

Eu li o " O desenvolvedor Absolute Cada mínima Software Absolutamente, Positivamente Precisa Saber Sobre Unicode e Caráter sets (Sem desculpas!) " artigo, mas eu preciso de algumas dicas específicas MySQL / PHP.

Pergunta: Como posso garantir que os dados inseridos usuário contendo caracteres internacionais não são corrompidos

Foi útil?

Solução

Na primeira olhada http://www.nicknettleton.com / zine / php / php-utf-8-cheatsheet Eu acho que uma coisa importante está faltando (talvez eu negligenciei este). Dependendo de sua instalação e / ou configuração do MySQL você tem que definir a conexão codificação para que o MySQL sabe o que codificação você está esperando no lado do cliente (ou seja, o lado do cliente da conexão MySQL, que deve ser você script PHP). Você pode fazer isso através da emissão manualmente um

SET NAMES utf8

consulta antes de qualquer outra consulta que você enviar para o servidor MySQL.

Se seu está usando DOP no lado do PHP você pode configurar a conexão para emitir automaticamente esta pergunta em cada (re) conectar usando

$db=new PDO($dsn, $user, $pass);
$db->setAttribute(PDO::MYSQL_ATTR_INIT_COMMAND, "SET NAMES utf8");

ao inicializar sua conexão db.

Outras dicas

Agrupamento e charset não são a mesma coisa. O seu agrupamento tem de corresponder ao conjunto de caracteres, por isso, se o seu charset é utf-8, assim se o agrupamento. Escolher o agrupamento errado, não irá garble seus dados embora -. Apenas certifique-string de comparação / classificação de trabalho de forma errada

Dito isto, existem vários lugares, onde você pode definir configurações charset em PHP. Eu recomendaria que você use utf-8 em todo, se possível. Lugares que as necessidades charset especificados são:

  • A base de dados. Isso pode ser definido no banco de dados, mesa e nível de campo, e até mesmo em um nível por consulta.
  • Conexão entre PHP e banco de dados.
  • HTTP de saída; Certifique-se de que o cabeçalho HTTP Content-Type especifica utf-8. Você pode definir valores padrão no PHP e no Apache, ou você pode usar o PHP é header função.
  • HTTP de entrada. Geralmente formulários serão submitteed no mesmo charset como a página foi servido, mas para ter certeza, você deve especificar o accept-charset propriedade. Também certifique-se de que o URL é utf-8 codificado, ou evitar o uso de caracteres não-ascii no do (e obter parâmetros) url.

utf8_encode / decodificação funções são um pouco estranhamente nomeado . Eles especificamente converter entre latin1 (ISO-8859-1) e utf-8. Se tudo em sua aplicação é utf-8, você não terá que usá-los muito.

Há pelo menos duas armadilhas em relação ao utf-8 e PHP. A primeira é que funções de cadeia embutido do PHP esperar cordas para ser single-byte. Por uma série de operações, isso não importa, mas isso significa que você não pode confiar em strlen e outras funções. Há uma boa run-down das limitações em desta página . Normalmente, não é um grande problema, mas especialmente quando se utiliza bibliotecas de 3 partido, você precisa estar ciente de que as coisas poderiam explodir sobre este assunto. Uma opção é também usar a extensão mb_string, que tem a opção de substituir todas as funções problemáticas com utf-8 alternativas conscientes. Ainda não é uma solução à prova de balas 100%, mas ele vai trabalhar para a maioria dos casos.

Outro problema é que algumas instalações do PHP ainda tem o magic_quotes configuração ativada. Este problema é ortogonal a utf-8, mas pode levar a alguns coçar cabeça. Desligá-lo, por causa de sua própria sanidade.

Não há muito a ser dito que não é coberta por este artigo

http://developer.loftdigital.com/blog/php-utf -8-cheatsheet

As coisas que você deve fazer:

  • Certifique-se que coloca Apache fora UTF-8 conteúdo. Fazer isso no seu httpd.conf, ou utilizar-função header() do PHP para fazê-lo manualmente.
  • Certifique-se de sua conexão com a base de dados é UTF8. SET NAMES utf8 faz o truque.
  • Certifique-se de todas as suas tabelas estão definidas para UTF8.
  • Certifique-se de todos os seus arquivos PHP e modelo são codificados como UTF-8 se você armazenar caracteres internacionais nos mesmos.

Você normalmente não tem que fazer para tanto usando o mb_string ou utf8_encode/decode-funções quando você faz isso.

Para melhor exatidão unicode, você deve usar utf8_unicode_ci (embora a documentação é um pouco vago sobre as diferenças). Você deve também certificar-se as seguintes bandeiras do MySQL estão definidos corretamente -

  • default-character-set = utf8
  • skip-character-set-client-handshake // Importante para que o cliente não impõe outra codificação

Aqueles pode ser definido no arquivo de configuração mysql (no separador [mysqld]) ou em tempo de execução, enviando as consultas adequadas.

Independentemente do idioma é escrito em, se você fosse para criar um aplicativo que permite uma grande variedade de codificações, manipulá-lo em pedaços:

  • Identificar a codificação
    • de alguma forma você quer descobrir que tipo de codificação você está lidando com, caso contrário, é bastante inútil para considerá-lo ainda mais. Você vai acabar com caracteres de lixo.
  • Lidar com seus bytes
    • pensar nessas cordas menos como 'strings' de personagens, e mais como listas de bytes
    • PHP é especialmente sorrateira. Não deixe que ele truncar os seus dados on-the-fly. Se você está regexing uma string UTF-8, certifique-se identificá-lo como tal
  • Loja para o LCD
    • Mais uma vez, você não deseja truncar dados. Se você está armazenando uma frase em Inglês, você também pode armazenar um conjunto de glyphps mandarim? Como cerca de árabe? Qual destes vai exigir mais espaço? Conta para isso.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top