php conjunto de caracteres mysql: armazenar html de conteúdo internacional

votos
2

Estou completamente confuso com o que eu li sobre conjuntos de caracteres. Estou desenvolvendo uma interface para armazenar texto francês formatado em html dentro de um banco de dados mysql.

O que eu entendi foi que a maneira segura de ter todos os caracteres especiais francês exibidos corretamente seria armazená-los como utf8. Então, eu criei um banco de dados mysql com utf8 especificado para o banco de dados e cada tabela. Eu posso ver através phpmyadmin que os personagens são armazenados exatamente da maneira que é suposto. Mas a saída desses personagens via php me dá resultados errados: caracteres acentuados são substituídos por caracteres sem sentido. Por que é que ?

eu tenho que utf8_encode ou utf8_decode-los? Atenção: o html encodign caráter página está definido para utf8.

de modo mais geral, qual é o caminho seguro para armazenar esses dados? Devo combinar htmlentities, addslashes e utf8_encode ao salvar e stripslashes, html_entity_decode e utf8_decode quando i saída?

Publicado 25/03/2009 em 12:46
fonte usuário
Em outras línguas...                            


4 respostas

votos
11

MySQL executa conversões conjunto de caracteres em tempo real para algo chamado de charset conexão . Você pode especificar este conjunto de caracteres usando a instrução SQL

SET NAMES utf8

ou usar uma função API específica tal como mysql_set_charset () :

mysql_set_charset("utf8", $conn);

Se isso for feito corretamente, não há necessidade de usar funções como utf8_encode () e utf8_decode ().

Você também tem que se certificar de que o navegador usa a mesma codificação. Isso geralmente é feito usando um cabeçalho simples:

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

(Note que o charset é chamado utf8 no navegador, mas utf8 no MySQL.)

Na maioria dos casos, o charset conexão e charset web são as únicas coisas que você precisa para acompanhar, por isso, se ele ainda não funciona provavelmente há algo mais você está fazendo errado. Tente experimentar com ele um pouco, que normalmente leva um tempo para entender completamente.

Respondeu 25/03/2009 em 12:52
fonte usuário

votos
0

Em adition ao que Emil H disse, você também precisa isto em sua página headtag:

<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
Respondeu 25/03/2009 em 13:15
fonte usuário

votos
1

É útil considerar a extremidade dianteira gerado-PHP e o back-end MySQL componentes separados. MySQL não deveria ter que se preocupar com a lógica de exibição, nem deve PHP assumir que o backend faz qualquer tipo de pré-processamento dos dados.

Meu conselho seria para armazenar os dados em caracteres simples usando a codificação UTF-8, e escapar quaisquer caracteres perigosas com métodos MySQLs. PHP, em seguida, lê os dados utf8 codificado de banco de dados, processa-los (com htmlentities (), na maioria das vezes), e exibe-lo através de qualquer que seja o modelo que você escolher para usar.

Emil H. sugeriu corretamente usando

 SET NAMES utf8

qual deve ser a primeira coisa que você chama depois de fazer uma conexão com o MySQL. Isso faz com que o MySQL tratar toda a entrada e saída como utf8.

Note que se você tem que usar funções utf8_encode ou utf8_decode, você não está definindo a codificação de caracteres html corretamente. É mais fácil para exigir que cada componente do seu sistema usa utf8, já que dessa forma você nunca deve ter que fazer manual de codificação / decodificação, que pode causar difícil de rastrear problemas mais tarde.

Respondeu 25/03/2009 em 13:17
fonte usuário

votos
2

Eu recomendo fortemente para ler este artigo " O desenvolvedor Absolute Minimum cada Software Absolutamente, Positivamente Precisa Saber Sobre Unicode e Conjuntos de caracteres (Sem Desculpas!) " Por Joel Spolsky, para entender o que está fazendo e por quê.

Respondeu 25/03/2009 em 13:39
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more