O problema da codificação chinesa na programação PHP tem incomodado muitas pessoas. A razão para esse problema é, na verdade, muito simples. Cada país (ou região) estipula o conjunto de codificação de caracteres para a troca de informações do computador, como o código ASCII estendido nos Estados Unidos e. GB2312 na China -80, JIS do Japão, etc. Como base para o processamento de informações neste país/região, os conjuntos de codificação de caracteres desempenham um papel importante na unificação da codificação. Os conjuntos de codificação de caracteres são divididos em duas categorias de acordo com o comprimento: SBCS (conjunto de caracteres de byte único) e DBCS (conjunto de caracteres de byte duplo). Nos primeiros softwares (especialmente nos sistemas operacionais), para resolver o processamento computacional de informações de caracteres locais, surgiram várias versões localizadas (L10N). Para diferenciar, foram introduzidos conceitos como LANG e Codepage. No entanto, devido à sobreposição de intervalos de códigos de vários conjuntos de caracteres locais, é difícil trocar informações entre si; o custo da manutenção independente de cada versão localizada do software é alto; Portanto, é necessário extrair os pontos em comum no trabalho de localização e processá-los de forma consistente para minimizar o conteúdo especial do processamento de localização. Isto também é chamado de internacionalização (118N). Várias informações de idioma são ainda padronizadas como informações de localidade. O conjunto de caracteres subjacente processado tornou-se Unicode, que contém quase todos os glifos.
Atualmente, a maior parte do processamento de caracteres principais do software com características internacionais é baseada em Unicode. Quando o software está em execução, as configurações de codificação de caracteres locais correspondentes são determinadas de acordo com as configurações de localidade/Lang/Codepage naquele momento, e os caracteres locais são determinados. processado em conformidade. Durante o processamento, é necessário realizar a conversão mútua entre Unicode e conjuntos de caracteres locais, ou mesmo a conversão mútua entre dois conjuntos de caracteres locais diferentes com Unicode como meio. Este método é ainda mais estendido no ambiente de rede, e qualquer informação de caractere em ambas as extremidades da rede também precisa ser convertida em conteúdo aceitável de acordo com as configurações do conjunto de caracteres.
Problemas de codificação de conjunto de caracteres em bancos de dados
Todos os sistemas de banco de dados relacionais populares suportam codificação de conjunto de caracteres de banco de dados, o que significa que você pode especificar suas próprias configurações de conjunto de caracteres ao criar um banco de dados, e os dados do banco de dados são armazenados na codificação especificada. Quando um aplicativo acessa dados, haverá conversão de codificação do conjunto de caracteres nos pontos de entrada e saída. Para dados chineses, a configuração de codificação de caracteres do banco de dados deve garantir a integridade dos dados. GB2312, GBK, UTF-8, etc. são todas codificações de conjunto de caracteres de banco de dados opcionais, é claro, também podemos escolher ISO8859-1 (8 bits), mas temos que converter um caractere chinês de 16 bits ou Unicode antes
da aplicação;
grava dados.Dividir em dois caracteres de 8 bits Depois de ler os dados, você precisa mesclar os dois bytes e identificar os caracteres SBCS. Portanto, não recomendamos o uso de ISO8859-1 como codificação do conjunto de caracteres do banco de dados. Isso não apenas não aproveita totalmente o suporte à codificação do conjunto de caracteres do próprio banco de dados, mas também aumenta a complexidade da programação. Ao programar, você pode primeiro usar as funções de gerenciamento fornecidas pelo sistema de gerenciamento de banco de dados para verificar se os dados chineses estão corretos.
Antes de consultar o banco de dados, o programa PHP primeiro executa mysql_query("SET NAMES xxxx"); onde xxxx é a codificação da sua página web (charset=xxxx). =gb2312 na página web, então xxxx=gb2312, quase todos os programas WEB possuem um código comum para se conectar ao banco de dados, que é colocado em um arquivo, basta adicionar mysql_query("SET NAMES xxxx").
SET NAMES mostra qual conjunto de caracteres é usado na instrução SQL enviada pelo cliente. Portanto, a instrução SET NAMES 'utf-8' informa ao servidor que "as informações futuras deste cliente usarão o conjunto de caracteres utf-8". Ele também especifica o conjunto de caracteres para os resultados que o servidor envia de volta ao cliente (por exemplo, se você usar uma instrução SELECT, ela indicará qual conjunto de caracteres será usado para os valores da coluna).
Técnicas comumente usadas para localizar problemas.
A localização de problemas de codificação chinesa geralmente usa o método mais estúpido e eficaz - imprimir o código interno da string após o processamento pelo programa que você considera suspeito. Ao imprimir o código interno de uma string, você pode descobrir quando os caracteres chineses são convertidos em Unicode, quando o Unicode é convertido novamente em código interno chinês, quando um caractere chinês se torna dois caracteres Unicode, quando uma string chinesa é convertida em uma string de pontos de interrogação, quando os bits de ordem superior da sequência de caracteres chineses foram truncados...
Tomar uma sequência de amostra apropriada também pode ajudar a distinguir o tipo de pergunta. Por exemplo: " aaahaa?@aa " e outras strings que são alternadas entre chinês e inglês e possuem caracteres característicos GB e GBK. De modo geral, os caracteres ingleses não serão distorcidos, não importa como sejam convertidos ou processados (se você os encontrar, você pode tentar aumentar o comprimento das letras inglesas consecutivas).
Resolva problemas de código distorcido em vários aplicativos
1) Use tags para definir a codificação da página
A função desta tag é declarar qual conjunto de caracteres a codificação que o navegador do cliente usa para exibir a página xxx pode ser GB2312, GBK, UTF-8 (diferente de GB2312, UTF-8). MySQL, que é UTF8) e assim por diante. Portanto, a maioria das páginas pode usar esse método para informar ao navegador qual codificação usar ao exibir esta página, para evitar erros de codificação e caracteres ilegíveis. Mas às vezes descobriremos que esta frase ainda não funciona. Não importa qual seja xxx, o navegador sempre usa a mesma codificação. Falarei sobre essa situação mais tarde.
Observe que ela pertence às informações HTML e é apenas uma declaração, que indica apenas que o servidor passou as informações HTML para o navegador.
2) header("content-type:text/html; charset=xxx");
A função desta função header() é enviar as informações entre colchetes para o cabeçalho http. Se o conteúdo entre colchetes for o mencionado no artigo, então a função é basicamente igual ao rótulo. Se você compará-lo com o primeiro, descobrirá que os caracteres são semelhantes. Mas a diferença é que se houver esta função, o navegador sempre utilizará a codificação xxx que você solicitou e nunca será desobediente, portanto esta função é muito útil. Por que isso está acontecendo? Então temos que falar sobre a diferença entre o cabeçalho http e as informações HTML:
o cabeçalho http é uma string enviada pelo servidor antes de enviar as informações HTML ao navegador usando o protocolo http. A tag pertence às informações HTML, então o conteúdo enviado por header() chega primeiro ao navegador. O ponto popular é que header() tem uma prioridade mais alta (não sei se posso dizer isso). Se uma página php tiver cabeçalho("content-type:text/html;charset=xxx") e header("content-type:text/html;charset=xxx") o navegador reconhecerá apenas o cabeçalho http anterior e não a meta. Claro, esta função só pode ser usada em páginas php.
Também resta uma pergunta: por que o primeiro definitivamente funciona, mas o último às vezes não funciona? Esta é a razão pela qual falaremos sobre o Apache a seguir.
3) AddDefaultCharset
Na pasta conf no diretório raiz do Apache, está todo o documento de configuração do Apache httpd.conf.
Abra httpd.conf com um editor de texto. A linha 708 (pode ser diferente em versões diferentes) contém AddDefaultCharset xxx, onde xxx é o nome da codificação. O significado desta linha de código: Defina o conjunto de caracteres no cabeçalho http do arquivo da página da web em todo o servidor para seu conjunto de caracteres xxx padrão. Ter esta linha equivale a adicionar um cabeçalho ("content-type: text/html; charset=xxx") a cada arquivo. Agora você pode entender por que o navegador sempre usa gb2312 mesmo estando configurado como utf-8.
Se houver um cabeçalho ("content-type:text/html; charset=xxx") na página da web, o conjunto de caracteres padrão será alterado para o conjunto de caracteres que você definiu, portanto, esta função sempre será útil. Se você adicionar um "#" na frente de AddDefaultCharset xxx, comentar esta frase, e a página não contém cabeçalho ("tipo de conteúdo..."), então é a vez da meta tag entrar em vigor.
A ordem de prioridade acima está listada abaixo:
.. header("content-type:text/html; charset=xxx")
.. AddDefaultCharset xxx
..
Se você é um programador web, é recomendado adicionar um cabeçalho a cada de suas páginas. ("content-type:text/html;charset=xxx"), isso garante que ele possa ser exibido corretamente em qualquer servidor e tenha forte portabilidade.
4) Configuração Default_charset em php.ini:
default_charset = "gb2312" em php.ini define o conjunto de caracteres de idioma padrão do php. Geralmente é recomendado comentar esta linha e deixar o navegador selecionar automaticamente o idioma com base no conjunto de caracteres no cabeçalho da página da web, em vez de fazer um requisito obrigatório, para que serviços da web em vários idiomas possam ser fornecidos no mesmo servidor.
Conclusão
Na verdade, a codificação chinesa no desenvolvimento de PHP não é tão complicada quanto se imagina. Embora não existam regras fixas para posicionamento e resolução de problemas e vários ambientes operacionais também sejam diferentes, os princípios subjacentes são os mesmos. Compreender o conhecimento dos conjuntos de caracteres é a base para resolver problemas de caracteres. Porém, com as mudanças no conjunto de caracteres chineses, não apenas a programação PHP, mas também problemas no processamento de informações chinesas ainda existirão por algum tempo.