El problema de la codificación china en la programación PHP ha preocupado a muchas personas. La razón de este problema es en realidad muy simple. Cada país (o región) estipula el conjunto de codificación de caracteres para el intercambio de información informática, como el código ASCII extendido en los Estados Unidos. GB2312 en China -80, JIS de Japón, etc. Como base para el procesamiento de información en este país/región, los conjuntos de codificación de caracteres desempeñan un papel importante en la unificación de la codificación. Los conjuntos de codificación de caracteres se dividen en dos categorías según su longitud: SBCS (juego de caracteres de un solo byte) y DBCS (juego de caracteres de doble byte). En los primeros software (especialmente los sistemas operativos), para resolver el procesamiento informático de información de caracteres locales, aparecieron varias versiones localizadas (L10N) para diferenciarlas, se introdujeron conceptos como LANG y Codepage. Sin embargo, debido a la superposición de rangos de códigos de varios conjuntos de caracteres locales, es difícil intercambiar información entre sí; el costo del mantenimiento independiente de cada versión localizada del software es alto; Por lo tanto, es necesario extraer los puntos comunes en el trabajo de localización y procesarlos de manera consistente para minimizar el contenido especial del procesamiento de localización. A esto también se le llama internacionalización (118N). La información sobre diversos idiomas se estandariza aún más como información local. El conjunto de caracteres subyacente procesado se convirtió en Unicode, que contiene casi todos los glifos.
En la actualidad, la mayor parte del procesamiento central de caracteres del software con características internacionales se basa en Unicode. Cuando el software se está ejecutando, la configuración de codificación de caracteres local correspondiente se determina de acuerdo con la configuración local / idioma / página de códigos en ese momento, y los caracteres locales son. procesado en consecuencia. Durante el procesamiento, es necesario realizar la conversión mutua entre Unicode y los juegos de caracteres locales, o incluso la conversión mutua entre dos juegos de caracteres locales diferentes con Unicode como medio. Este método se extiende aún más en el entorno de red, y cualquier información de caracteres en ambos extremos de la red también debe convertirse en contenido aceptable de acuerdo con la configuración del juego de caracteres.
Problemas de codificación de juegos de caracteres en bases de datos
Todos los sistemas de bases de datos relacionales populares admiten la codificación de juegos de caracteres de bases de datos, lo que significa que puede especificar su propia configuración de juego de caracteres al crear una base de datos, y los datos de la base de datos se almacenan en la codificación especificada. Cuando una aplicación accede a datos, habrá una conversión de codificación de juego de caracteres tanto en el punto de entrada como en el de salida. Para los datos chinos, la configuración de codificación de caracteres de la base de datos debe garantizar la integridad de los datos. GB2312, GBK, UTF-8, etc. son codificaciones de conjuntos de caracteres de base de datos opcionales, por supuesto, también podemos elegir ISO8859-1 (8 bits), pero tenemos que convertir un carácter chino de 16 bits o Unicode antes de
la aplicación.
escribe datos.Se divide en dos caracteres de 8 bits. Después de leer los datos, debe fusionar los dos bytes e identificar los caracteres SBCS. Por lo tanto, no recomendamos utilizar ISO8859-1 como codificación del conjunto de caracteres de la base de datos. Esto no sólo no aprovecha al máximo el soporte de codificación del juego de caracteres de la propia base de datos, sino que también aumenta la complejidad de la programación. Al programar, primero puede utilizar las funciones de administración proporcionadas por el sistema de administración de bases de datos para verificar si los datos chinos son correctos.
Antes de consultar la base de datos, el programa PHP primero ejecuta mysql_query("SET NAMES xxxx"); donde xxxx es la codificación de su página web (charset=xxxx si charset=utf8 en la página web, entonces xxxx=utf8, si charset). =gb2312 en la página web, Luego xxxx=gb2312, casi todos los programas WEB tienen un código común para conectarse a la base de datos, que se coloca en un archivo, en este archivo, simplemente agregue mysql_query ("SET NAMES xxxx").
SET NAMES muestra qué juego de caracteres se utiliza en la declaración SQL enviada por el cliente. Por lo tanto, la declaración SET NAMES 'utf-8' le dice al servidor que "la información futura de este cliente utilizará el conjunto de caracteres utf-8". También especifica el juego de caracteres para los resultados que el servidor envía al cliente (por ejemplo, si usa una instrucción SELECT, indica qué juego de caracteres se usa para los valores de la columna).
Las técnicas más utilizadas para localizar problemas.
La localización de problemas de codificación china suele utilizar el método más estúpido y eficaz: imprimir el código interno de la cadena después de procesarla con el programa que cree que es sospechoso. Al imprimir el código interno de una cadena, puede saber cuándo los caracteres chinos se convierten a Unicode, cuándo Unicode se vuelve a convertir a código interno chino, cuándo un carácter chino se convierte en dos caracteres Unicode y cuándo una cadena china se convierte en una cadena de signos de interrogación, ¿cuándo se truncaron los bits de orden superior de la cadena de caracteres chinos?
Tomar una cadena de muestra adecuada también puede ayudar a distinguir el tipo de pregunta. Por ejemplo: " aaahaa?@aa " y otras cadenas que alternan entre chino e inglés y que tienen caracteres característicos GB y GBK. En términos generales, los caracteres en inglés no se distorsionarán sin importar cómo se conviertan o procesen (si los encuentra, puede intentar aumentar la longitud de las letras en inglés consecutivas).
Resuelva problemas de código confuso en varias aplicaciones
1) Utilice etiquetas para configurar la codificación de la página.
La función de esta etiqueta es declarar qué codificación de conjunto de caracteres utiliza el navegador del cliente para mostrar la página xxx puede ser GB2312, GBK, UTF-8 (diferente de. MySQL, que es UTF8) y así sucesivamente. Por lo tanto, la mayoría de las páginas pueden utilizar este método para indicarle al navegador qué codificación utilizar al mostrar esta página, a fin de evitar errores de codificación y caracteres confusos. Pero a veces encontraremos que esta oración aún no funciona, no importa cuál sea xxx, el navegador siempre usa la misma codificación. Hablaré de esta situación más adelante.
Tenga en cuenta que pertenece a la información HTML y es solo una declaración, que solo indica que el servidor ha pasado la información HTML al navegador.
2) header("content-type:text/html; charset=xxx");
La función de esta función header() es enviar la información entre corchetes al encabezado http. Si el contenido entre paréntesis es el mencionado en el artículo, entonces la función es básicamente la misma que la etiqueta. Si lo compara con la primera, encontrará que los caracteres son similares. Pero la diferencia es que si existe esta función, el navegador siempre usará la codificación xxx que usted solicitó y nunca será desobediente, por lo que esta función es muy útil. ¿Por qué sucede esto? Entonces tenemos que hablar sobre la diferencia entre el encabezado http y la información HTML:
el encabezado http es una cadena enviada por el servidor antes de enviar información HTML al navegador utilizando el protocolo http. La etiqueta pertenece a información HTML, por lo que el contenido enviado por header() llega primero al navegador. El punto popular es que header() tiene mayor prioridad (no sé si puedo decir esto). Si una página php tiene encabezado("content-type:text/html;charset=xxx") y encabezado("content-type:text/html;charset=xxx"), el navegador solo reconocerá el encabezado http anterior y no el meta. Por supuesto, esta función sólo se puede utilizar dentro de páginas php.
También queda una pregunta: ¿por qué el primero definitivamente funciona, pero el segundo a veces no funciona? Esta es la razón por la que hablaremos de Apache a continuación.
3) AddDefaultCharset
En la carpeta conf en el directorio raíz de Apache, se encuentra el documento de configuración completo de Apache httpd.conf.
Abra httpd.conf con un editor de texto. La línea 708 (puede ser diferente en diferentes versiones) contiene AddDefaultCharset xxx, donde xxx es el nombre de codificación. El significado de esta línea de código: establezca el juego de caracteres en el encabezado http del archivo de la página web en todo el servidor en su juego de caracteres xxx predeterminado. Tener esta línea equivale a agregar un encabezado ("content-type: text/html; charset=xxx") a cada archivo. Ahora puede comprender por qué el navegador siempre usa gb2312 aunque esté configurado en utf-8.
Si hay un encabezado ("content-type:text/html; charset=xxx") en la página web, el juego de caracteres predeterminado se cambiará al juego de caracteres que usted configuró, por lo que esta función siempre será útil. Si agrega un "#" delante de AddDefaultCharset xxx, comenta esta oración y la página no contiene encabezado ("tipo de contenido..."), entonces es el turno de que la metaetiqueta surta efecto.
El orden de prioridad de lo anterior se enumera a continuación:
.. header("content-type:text/html; charset=xxx")
.. AddDefaultCharset xxx
..
Si es programador web, se recomienda agregar un encabezado a cada de sus páginas ("content-type:text/html;charset=xxx"), esto garantiza que se pueda mostrar correctamente en cualquier servidor y que tenga una gran portabilidad.
4) Configuración default_charset en php.ini:
default_charset = "gb2312" en php.ini define el conjunto de caracteres del idioma predeterminado de php. En general, se recomienda comentar esta línea y dejar que el navegador seleccione automáticamente el idioma según el juego de caracteres en el encabezado de la página web en lugar de hacer un requisito obligatorio, para que se puedan proporcionar servicios web en varios idiomas en el mismo servidor.
Conclusión
De hecho, la codificación china en el desarrollo de PHP no es tan complicada como se imagina. Aunque no existen reglas fijas para posicionar y resolver problemas, y los distintos entornos operativos también son diferentes, los principios subyacentes son los mismos. Comprender el conocimiento de los conjuntos de caracteres es la base para resolver problemas de personajes. Sin embargo, con los cambios en el juego de caracteres chinos, no sólo la programación PHP, sino también los problemas en el procesamiento de información china seguirán existiendo durante algún tiempo.