diferentes codificaciones php

  1. Editor
  2. x64 (aka andi)

Los guionistas novatos no se preocupan por la codificación

Los guionistas novatos no se preocupan por la codificación. Por lo tanto, en los sitios a veces se puede encontrar un lío terrible, cuando los datos de la base de datos se obtienen en una codificación, la página se forma en otra y el servidor recibe la tercera. como resultado, si la página se puede descifrar, al menos 2 veces. Entonces, ¿por qué ocurre este problema y cómo superarlo?

en el segmento ruso más a menudo se puede encontrar la llamada codificación de Windows. llámelo de manera diferente: windows-1251, cp1251 o incluso ansi. el siguiente es utf-8. También puede encontrar el nombre Unicode, pero esto no es del todo correcto, ya que Unicode es el nombre general de todo el grupo (utf-8, utf-16, utf-32). y una rareza muy popular es koi8-r o simplemente koi-8, la antigua codificación de Linux popular. Por supuesto, es posible encontrar algo más en el segmento ruso, pero esto es más bien una "indulgencia" por parte del autor.

La principal diferencia entre utf-8 y otros (principalmente windows-1251 y koi8-r) es el último byte, y el número máximo de caracteres que pueden representarse usando estas codificaciones se limita a 256. No hace falta decir que para una presentación completa del texto de este Puede que no sea suficiente. y para html se encontró una solución: el uso de los llamados mnemónicos. por ejemplo:

© - & copia;

además del hecho de que cada uno de estos caracteres está descrito por un grupo de caracteres, el código se vuelve ilegible y el trabajo con el texto se vuelve más complicado. aquí es donde el multibyte utf-8 viene al rescate. es muy conveniente utilizar letras de diferentes alfabetos y diferentes símbolos en un texto.

Por lo tanto, el conjunto de condiciones iniciales más cómodo es el siguiente: la codificación de la base de datos, los scripts php y los scripts html pages / js deben ser los mismos. Por supuesto, puede usar diferentes, pero en este caso existe el riesgo de confundirse. no importa qué página de códigos se utiliza. Si el sitio es solo para una audiencia de habla rusa, windows-1251 será suficiente. de lo contrario, utf-8 sería la opción lógica. La primera opción es más o menos clara. La codificación multibyte requerirá algunos gestos.

Cuando se trabaja con utf-8, ¡una libreta de notas estándar no funcionará ! El hecho es que este editor, al guardar un archivo en esta codificación, agrega una firma al principio: 3 caracteres, el llamado bom (marca de orden de bytes), que se puede usar para determinar la codificación al abrir un archivo. Es mejor elegir otro editor: notepad2 o notepad ++ . en la configuración debe elegir guardar sin una firma.

El siguiente paso importante es trabajar con la base de datos. Es altamente deseable que la codificación del campo base / tabla / texto coincida con la codificación del script (podría ser cp1251 o utf-8, o algo más). Si los datos de la base de datos se obtienen en forma de "zyuk", lo más probable es que la codificación de la conexión sea diferente de los datos almacenados en la base de datos. La siguiente consulta ayudará a superar la situación (ejecutar inmediatamente después de conectarse a la base de datos):

si el sitio utiliza windows-1251, debe especificarlo - cp1251.

En general, no hay nada difícil. solo, las funciones estándar de php no están diseñadas para funcionar con cadenas multibyte. Pero hay bibliotecas estándar que ayudarán a corregir la situación: iconv y mbstring . para expresiones regulares, también hay un interruptor necesario que se activa con el modificador u .

Bueno, los datos de la base de datos se obtienen, los scripts se escriben de acuerdo con todas las reglas. Queda por enviar el título correcto y mostrar el código de la página en el navegador del usuario. Enviamos rumbo asi:

encabezado ('Tipo de contenido: texto / html; conjunto de caracteres = utf-8');

Si se utiliza la codificación de un solo byte, el valor para el conjunto de caracteres será diferente: windows-1251 . Después de eso, los problemas no deberían permanecer.

Algunos ejemplos más simples de trabajar con utf-8 en php:

ejemplo 1: iconv, número de caracteres por línea

$ s = 'cadena'; # cadena en utf-8 $ cnt1 = strlen ($ s); # contendrá el valor $ 12 cnt2 = iconv_strlen ($ s, 'UTF-8'); # valor correcto, 6

ejemplo 2: mbstring, el número de caracteres en una cadena

$ s = 'cadena'; # cadena en utf-8 $ cnt1 = strlen ($ s); # contendrá el valor $ 12 cnt2 = mb_strlen ($ s, 'UTF-8'); # valor correcto, 6

ejemplo 3: expresiones regulares, buscar y reemplazar

$ s = 'String'; # line en utf-8 $ s = preg_replace ('/ p / i', 'd', $ s); # reemplazo no sucederá $ s = preg_replace ('/ p / iu', 'd', $ s); # resultado word dock

el modificador i prescribe una búsqueda que no distingue entre mayúsculas y minúsculas, y el modificador u indica al motor de expresiones regulares que trabaje con cadenas utf-8.

Si alguien dice que PHP no puede funcionar con utf-8, estará mal. Desde hace varios años he estado haciendo todos mis proyectos en esta codificación y no he tenido ningún problema. Los motores de búsqueda han utilizado durante mucho tiempo esta codificación maravillosa.

Editor

fuera de línea 11 horas

x64 (aka andi)

Comentarios: 2846 Publicaciones: 395 Inscripción: 02-04-2009

Entonces, ¿por qué ocurre este problema y cómo superarlo?