2010-06-28

UTF-8: El secreto de la Codificación de caracteres

Los secretos de UTF-8 todo sobre como trabajar con UTF-8 para no tener problemas.

Link al sitio Ingles

UTF-8: El secreto de la Codificación de caracteres

Codificación de caracteres y conjuntos de caracteres no son tan difíciles de entender, pero muchas personas tan alegremente tropezar a través del mundo de la programación sin saber qué hacer realmente en ello, o decir "Ah, es un trabajo para aquellos internacionalización expertos ". No, no lo es! Este documento le guiará a través de la determinación de la codificación de su sistema y cómo se debe manejar esta información. Se mantenga alejado del debate excesiva en el funcionamiento interno de la codificación de caracteres.

Este documento no está diseñado para ser leído en su totalidad: lentamente se introducen conceptos que se basan en la otra: no es necesario llegar al fondo de haber aprendido algo nuevo. Sin embargo, le recomiendo que lea todo el camino hasta qué UTF-8?, porque al menos en ese punto que te han hecho una decisión consciente de no migrar, que puede ser una gratificante (aunque difícil) tarea.

Aparte

Texto en este formato es una a un lado, datos interesantes para el, pero no estrictamente material necesario curiosidad por ver el tutorial. Si usted lee este texto, usted saldrá con una mayor comprensión de las cuestiones subyacentes.

Tabla de contenidos

  1. Encontrar la codificación real
  2. Encontrar la codificación incrustado
  3. La fijación de la codificación
    1. Ninguna codificación incrustado
    2. codificación incrustado no está de acuerdo
    3. Cambiar el servidor de codificación
      1. cabecera () de PHP
      2. PHP directiva ini
      3. No PHP
      4. . Htaccess
      5. Las extensiones de fichero
    4. XML
    5. Dentro del proceso de
  4. ¿Por qué UTF-8?
    1. Internacionalización
    2. Fácil de utilizar
    3. Formularios
      1. application / x-www-form-urlencoded
      2. multipart / form-data
    4. Bien apoyado
    5. Purificadores de HTML
  5. Migrar a UTF-8
    1. Configuración de la base de datos
      1. Legible método
      2. Binario
    2. Editor de textos
    3. Byte Order Mark (headers already sent!)
    4. Fuentes
      1. Oscuro scripts
      2. Uso ocasional
    5. Tratar con ancho variable en las funciones
  6. Lecturas

Encontrar la codificación real

En el principio existía la ASCII, y las cosas eran simples. Pero no eran buenas, porque no se podía escribir en cirílico o el tailandés. Así que hizo explotar una proliferación de las codificaciones de caracteres para remediar el problema mediante la ampliación de los caracteres ASCII pueden expresar. Esta ridícula versión simplificada de la historia de las codificaciones de caracteres nos muestra que en la actualidad hay muchas codificaciones de caracteres que flotan alrededor.

Una codificación de caracteres indica al equipo cómo interpretar los ceros primas y en personajes reales. Por lo general lo hace por la vinculación con los números de caracteres.

Hay muchos diferentes tipos de codificaciones de caracteres flotando alrededor, pero los tratamos con más frecuencia con son ASCII, 8 bits de codificación, y basado en la codificación Unicode.

  • ASCII es una codificación de 7-bit basado en el alfabeto Inglés.
  • 8 bits de codificación son extensiones de ASCII que añadir un popurrí de utilidad, caracteres no estándar, como é y æ. Sólo puede agregar 127 caracteres, por lo general, sólo admiten una secuencia de comandos a la vez. Cuando vea una página en la web, lo más probable es que es codificada en una de estas codificaciones.
  • Basado en la codificación Unicode a la norma Unicode y son UTF-8, UTF-16 y UTF-32/UCS-4. Van más allá de 8-bits y un apoyo casi todos los idiomas del mundo. UTF-8 está ganando la tracción como la codificación internacional dominante de la web.

El primer paso de nuestro viaje es descubrir cuál es la codificación de su sitio web es. La forma más fiable es preguntarle a su navegador:

Mozilla Firefox
Herramientas> Información de la página: Codificación
Internet Explorer
Ver> Codificación: elemento con viñeta no es oficial el nombre

Internet Explorer no le dará el MIME (es decir, útiles o reales) a nombre de la codificación de caracteres, así que tendrás que consultarlo con su descripción. Entre los más comunes:

Descripción de IE Mime Nombre
Windows
Árabe (Windows)Windows-1256
Báltico (Windows)Windows-1257
Central Europeo (Windows)Windows-1250
Cirílico (Windows)Windows-1251
Griego (Windows)Windows-1253
Hebreo (Windows)Windows-1255
Tailandés (Windows)TIS-620
Turco (Windows)Windows-1254
Vietnamita (Windows)Windows-1258
Europa occidental (Windows)Windows-1252
ISO
Árabe (ISO)ISO-8859-6
Báltico (ISO)ISO-8859-4
Central Europeo (ISO)ISO 8859-2
Cirílico (ISO)Con la norma ISO-8859-5
Estonia (ISO)ISO 8859-13
Griego (ISO)ISO-8859-7
Hebreo (ISO-lógicos)ISO-8859-8-l
Hebreo (ISO-Visual)ISO-8859-8
América 9 (ISO)ISO-8859-15
Turco (ISO)ISO-8859-9
Europa occidental (ISO)ISO-8859-1
Otro
Chino simplificado (GB18030)GB18030
Chino simplificado (GB2312)GB2312
Chino simplificado (HZ)HZ
Chino tradicional (Big5)Big5
Japonés (Shift-JIS)Shift_JIS
Japonés (EUC)EUC-JP
CoreanoEUC-KR
Unicode (UTF-8)UTF-8

Internet Explorer no reconoce algunas de las codificaciones de caracteres más oscura, y tener que buscar el nombre real con una mesa es un dolor, así que recomiendo el uso de Mozilla Firefox para averiguar su codificación de caracteres.

Encontrar la codificación incrustado

En este punto, ustedes se estarán preguntando, "¿No tenemos ya descubrir nuestra codificación?" Bueno, como resulta, hay varios lugares donde un desarrollador web puede especificar una codificación de caracteres, y un lugar que se encuentra en un META tag:

Usted encontrará esto en el HEAD sección de un documento HTML. El texto a la derecha del charset = es la "supuesta" codificación: el HTML pretende ser esta codificación, pero si este es realmente el caso, depende de otros factores . Por ahora, tome nota si su META reclamaciones etiqueta que:

  1. La codificación de caracteres es la misma que la reportada por el navegador,
  2. La codificación de caracteres es diferente a la del navegador, o
  3. No hay META etiquetas a todos! (Horror, horror!)

La fijación de la codificación

El consejo dado aquí es para páginas que se desempeñó como vainilla text / html. La disparidad de prácticas debe ser utilizado para la aplicación / xml o application / xhtml + xml, vea el documento del W3C sobre XHTML tipos de medios para obtener más información.

Si tu META y su codificación coincida con la codificación real, inteligente! Puede omitir esta sección. Si no lo hacen ...

Ninguna codificación incrustado

Si este es el caso, usted querrá agregar en el caso META etiquetas a su sitio web. Es tan simple como copiar y pegar el código anterior y la sustitución de UTF-8 con lo que es el nombre de su codificación MIME real.

Para todos aquellos escépticos por ahí, hay una buena razón por la codificación de caracteres debería indicarse expresamente. Cuando el navegador no se le dice lo que la codificación de caracteres de un texto es, tiene que adivinar: la conjetura y, a veces se equivoca. Los hackers pueden manipular esta suposición con el fin de burlar los filtros XSS y luego engañar al navegador para que ejecute como código activo. Un gran ejemplo de esto es el Google UTF-7 explotar.

Usted podría ser capaz de salirse con la suya no especificar una codificación de caracteres con la META etiqueta, siempre y cuando su servidor web envía el encabezado Content-Type correcta, pero ¿por qué arriesgarse? Además, si el usuario descarga el archivo HTML, ya no hay ningún servidor web para definir la codificación de caracteres.

codificación incrustado no está de acuerdo

Esto es un error muy común: otra fuente está diciendo lo que el navegador es la codificación de caracteres y es imperiosa la codificación incrustado. Esta fuente suele ser el tipo de contenido HTTP header-que el servidor web (por ejemplo Apache) envía. Un encabezado Content-Type habitual enviado con una página puede tener este aspecto:

Content-Type: text / html; charset = ISO-8859-1

Nótese cómo hay un parámetro charset: esta es la manera del servidor web de decirle a un navegador lo que la codificación de caracteres es muy similar a la META etiquetas que abordó con anterioridad.

De hecho, la META etiqueta está diseñado como un sustituto de la cabecera HTTP para contextos en los encabezados de envío es imposible (como archivos almacenados localmente sin un servidor web). Así, el nombre http-equiv (equivalente HTTP).

Hay dos maneras de ir sobre la fijación del mismo: cambiar el META tag para que coincida con el encabezado de HTTP, o cambiar el encabezado HTTP para coincidir con el META tag. ¿Cómo sabemos que hacer? Depende de la página web de contenido: después de todo, los encabezados y las etiquetas son sólo formas de describir a los personajes reales en la página web.

Si su página web:

... Sólo utiliza caracteres ASCII,
De cualquier forma está bien, pero te recomiendo cambiar tanto a UTF-8 (más sobre esto más adelante).
... Utiliza caracteres especiales, y que se visualice correctamente,
Cambiar la codificación integrado para la codificación del servidor.
... Utiliza caracteres especiales, pero los usuarios a menudo se quejan de que salen distorsionadas,
Cambiar el servidor de codificación para la codificación incrustado.

Cambio de una etiqueta META es fácil: basta intercambiar la codificación viejo por lo nuevo. Cambiar el servidor (encabezado HTTP) de codificación, sin embargo, es un poco más difícil.

Cambiar el servidor de codificación

cabecera () de PHP

La forma más sencilla de manejar este problema es el envío de la codificación de ti mismo, a través de su lenguaje de programación. Puesto que usted está usando HTML Purifier, voy a asumir PHP, aunque no es demasiado difícil de hacer cosas similares en otros idiomas. El código correspondiente es:

cabecera("Content-Type: text / html; charset = UTF-8 ');

... Sustitución de UTF-8 con lo que su codificación es incrustado. Este código debe venir antes que cualquier salida, por lo que tener cuidado con los espacios en blanco perdida en su aplicación (es decir, cualquier espacio en blanco antes de la salida con exclusión de los espacios en blanco dentro de Etiquetas).

PHP directiva ini

PHP también tiene un poco directiva ini aseado que le puede ahorrar una cabecera llamada: default_charset. El uso de este código:

ini_set('default_charset', 'UTF-8');

... También hará el truco. Si PHP se está ejecutando como un módulo de Apache (y no como FastCGI, consulte a phpinfo() para más detalles), usted puede incluso utilizar htaccess para aplicar esta propiedad a través de muchos archivos de PHP:

php_value default_charset "UTF-8"

Al igual que con todas las directivas INI, esto también puede ir en su archivo php.ini. Algunos proveedores de hosting le permiten personalizar su archivo php.ini propio, pedimos su apoyo para obtener más detalles. Uso:

default_charset = "utf-8"

No PHP

Es posible que, por cualquier razón, necesitan configurar la codificación de caracteres en la no-archivos PHP, por lo general ol llano archivos HTML. Hacer esto es más de un golpe-o-falta de trabajo: según el software utilizado como un servidor web y la configuración de dicho software, ciertas técnicas pueden funcionar, o no pueden trabajar.

. Htaccess

En Apache, puede utilizar un htaccess. Archivo para cambiar la codificación de caracteres. Voy a aplazar hasta el W3C para la explicación en profundidad, pero se reduce a la creación de un archivo llamado. htaccess con el contenido:

AddCharset UTF-8. html

En caso de UTF-8 se sustituye por la codificación de caracteres que desea utilizar ya. Html es un archivo de extensión que se aplicará. Esta codificación de caracteres a continuación, se establecerá para cualquier archivo directamente en o en los subdirectorios del directorio en el que colocar este archivo pulg

Si te sientes particularmente valiente, se puede utilizar:

AddDefaultCharset UTF-8

... Que cambia el juego de caracteres Apache se suma a cualquier documento que no tiene parámetros de tipo de contenido. Esta directiva, que el archivo de configuración por defecto establece la norma ISO-8859-1 por razones de seguridad, se debe probablemente que los encabezados no coincide con la META tag. Si prefiere no ser Apache cornada en el carácter de su codificación, puede decirle que no a enviar nada de nada:

AddDefaultCharset Off

... Haciendo que su declaración charset interno (por lo general el META tags) la única fuente de información de codificación de caracteres. En estos casos, es especialmente importante asegurarse de que tiene validez META tags en sus páginas y todo el texto antes de ellos es ASCII.

Estas directrices también se pueden colocar en el archivo httpd.conf de Apache, pero en la mayoría de las situaciones de alojamiento para compartir, no será capaz de editar este archivo.

Las extensiones de fichero

Si no está permitido el uso de los ficheros. Htaccess, a menudo puede piggy-back off por defecto de Apache declaraciones AddCharset para obtener sus archivos en la extensión adecuada. Éstos son los caracteres por defecto de Apache establecidos declaraciones:

Charset Extensión de archivo (s)
ISO-8859-1. Iso8859-1. Latin1
ISO 8859-2. ISO8859-2. Latin2. Precios
ISO-8859-3. Iso8859-3. Latin3
ISO-8859-4. Iso8859-4. Latin4
Con la norma ISO-8859-5. Iso8859-5. Latin5. Cyr. Iso-ru
ISO-8859-6. Iso8859-6. Latin6. Arb
ISO-8859-7. Iso8859-7. Latin7. Grk
ISO-8859-8. ISO8859-8. Latin8. Has
ISO-8859-9. Iso8859-9. Latin9. Trk
ISO-2022-JP. Iso2022-jp. Jis
ISO-2022-KR. Iso2022-kr. Kis
ISO-2022-CN. Iso2022-cn. Cis
Big5. Big5. Big5. B5
WINDOWS-1251. Cp-1251. Ganar-1251
CP866. CP866
KOI8-r. KOI8-R. KOI8-ru
KOI8-ru. KOI8-uk. Ua
ISO-10646-UCS-2. UCS2
ISO-10646-UCS-4. UCS4
UTF-8. Utf8
GB2312. GB2312. Gb
utf-7. Utf7
EUC-TW. EUC-TW
EUC-JP. EUC-JP
EUC-KR. EUC-KR
shift_jis. Sjis

Así, por ejemplo, un archivo denominado page.utf8.html o page.html.utf8 probablemente será enviado con el juego de caracteres UTF-8 adjunto, la diferencia de que si hay un juego de caracteres AddCharset. html declaración, prevalecerá sobre el. utf8 extensión en page.utf8.html (precedencia se mueve de derecha a izquierda). Por defecto, Apache no tiene declaración.

Microsoft IIS

Si alguien puede aportar información sobre cómo configurar Microsoft IIS para cambiar codificaciones de caracteres, estaría agradecido.

XML

META etiquetas son las fuentes más comunes de codificación integrado, pero también pueden venir de otra parte: Declaraciones XML. Se ven como:

... Y se encuentran más frecuentemente en los documentos XML (incluyendo XHTML).

Para XHTML, XML teóricamente esta Declaración reemplaza el META tag. En realidad, esto ocurre sólo cuando el XHTML es en realidad sirvió como legítimo XML y no en HTML, que es casi siempre, nunca debido a la del Explorador de Internet no tienen el apoyo para la aplicación / xhtml + xml (a pesar de ello se suele decir que las buenas prácticas y es requerido por la especificación XHTML 1.1).

Para XML, sin embargo, esta declaración XML es extremadamente importante. Como la mayoría de servidores web no están configurados para enviar juegos de caracteres para los archivos. Xml, esta es la única cosa que un intérprete tiene que seguir adelante. Por otra parte, el valor por defecto para los archivos XML es UTF-8, que a menudo la cabeza con las culatas más común de la ISO-8859-1 de codificación (vea este en RSS feeds ilegible).

En resumen, si utiliza XHTML y han pasado por la molestia de añadir la declaración XML, asegúrese de que jives con su META etiquetas (que sólo debe estar presente si sirve en text / html) y las cabeceras HTTP.

Dentro del proceso de

Esta sección no es de lectura obligatoria, pero puede responder a algunas de sus preguntas sobre lo que está pasando en todo este galimatías de codificación de caracteres. Si usted está interesado en pasar a la fase siguiente, salte esta sección.

Una pregunta lógica que sigue a todos nuestros trapicheando con múltiples fuentes de codificación de caracteres es "¿Por qué hay muchas opciones para que?" Para responder a esta pregunta, tenemos que volver nuestra definición de las codificaciones de caracteres: permiten un programa para interpretar los bytes en caracteres legibles por humanos.

Por lo tanto, un problema del huevo o pollo: una codificación de caracteres es necesario interpretar el texto de un documento. A META etiqueta está en el texto de un documento. El META etiqueta proporciona la codificación de caracteres. ¿Cómo podemos determinar el contenido de un META tag, dentro del texto, si no sabemos que es la codificación de caracteres? Y ¿cómo entender la codificación de caracteres, si no sabemos el contenido del META tag?

Afortunadamente para nosotros, los personajes que tenemos que escribir la META en ASCII, que es casi universal sobre todos los codificación de caracteres que está en uso común hoy en día. Así, todos los navegador web tiene que hacer es analizar todo el camino hasta que llega a la etiqueta de contenido de tipo, extracto de la codificación de caracteres de etiqueta, a continuación, volver a analizar el documento de acuerdo con esta nueva información.

Obviamente, esto es complicado, por lo que prefieren los navegadores de la más simple y eficaz solución: obtener la codificación de caracteres a partir de un lugar que el propio documento, es decir, las cabeceras HTTP, para disgusto de los autores de documentos HTML que no se puede establecer a estos títulos.

¿Por qué UTF-8?

Esto significa que ha pasado por todos los problemas de garantizar que el servidor y todos sus personajes incrustados se alinean correctamente y están presentes. Buen trabajo: en este punto, usted podría salir y estar tranquilo sabiendo que sus páginas no son vulnerables a ataques XSS codificación de caracteres estilo. Sin embargo, al igual que tener una codificación de caracteres es mejor que no tener la codificación de caracteres en absoluto, con UTF-8 como su codificación de caracteres es mejor que tener alguna codificación de caracteres al azar otros, y el siguiente paso es convertir a UTF-8. ¿Pero por qué?

Internacionalización

Muchos proyectos de software, en un momento u otro, de repente darse cuenta de que debe apoyar más de un idioma. Incluso el uso regular en un solo idioma a veces requiere el especial carácter ocasional que, sin sorpresa, no está disponible en su conjunto de caracteres. A veces los desarrolladores evitar esto agregar soporte para codificaciones múltiples: cuando se utiliza chino, Big5 uso, cuando con el japonés, el uso Shift-JIS, al utilizar griego, etc En otras ocasiones, utilizan referencias de caracteres con gran celo.

UTF-8, sin embargo, evita la necesidad de alguna de esas medidas complicadas. Después de conseguir el sistema para que utilice UTF-8 y el ajuste de las fuentes que están fuera de la mano del explorador (más sobre esto más adelante), UTF-8 simplemente funciona. Usted puede utilizarlo para cualquier lengua, incluso muchos idiomas a la vez, usted no tiene que preocuparse de la gestión de múltiples codificaciones, usted no tiene que usar esas entidades hostiles-usuario.

Fácil de utilizar

Páginas web codificados en Latin-1 (ISO-8859-1) que a veces necesita un carácter especial fuera de su alcance con frecuencia utiliza un carácter de referencia de la entidad para lograr el efecto deseado. Por ejemplo, se puede escribir θ θ, independientemente de su carácter de soporte para la codificación de las letras griegas.

Esto funciona muy bien para un uso limitado de caracteres especiales, pero quería decir que esta frase de texto en chino: láser, lo que se entiende por esta palabra. La versión codificada signo se vería así:

激光, 这 两个字 是 什么 意思

Muy incómodo para aquellos de nosotros que realmente saben lo que son las entidades de caracteres, totalmente ininteligible para los usuarios pobres que no! Incluso los poco más fácil de usar, "inteligible" entidades de caracteres como θ dejará a los usuarios que no están interesados en aprender HTML rascarse sus cabezas. Por otro lado, si ven θ en un cuadro de edición, van a saber que es un carácter especial, y tratarlo en consecuencia, incluso si no saben cómo escribir que sí carácter.

Wikipedia es un gran caso de estudio para una aplicación que utilizó originalmente ISO-8859-1, pero lo cambió a UTF-8 cuando se convirtió en la fecha para engorroso para apoyar las lenguas extranjeras. Bots ahora realmente van a través de artículos y convertir a sus entidades de caracteres personajes reales correspondientes en aras de la facilidad de uso y capacidad de búsqueda. Véase la página en meta sobre los caracteres especiales para más detalles.

Formularios

Si bien estamos en el rumbo de los usuarios, ¿cómo no UTF-8 Web tratar las formas con los personajes que nuestro fuera de su conjunto de caracteres? En lugar de discutir lo que UTF-8 hace bien, vamos a mostrar lo que podía salir mal si usted no utilizar UTF-8 y se trató de utilizar caracteres fuera de su codificación de caracteres.

Los problemas son grandes, amplias y extremadamente difíciles de fijar (o, al menos, bastante difícil que si tuviera el tiempo y recursos para invertir en hacer la revisión, sería probablemente mejor de la migración a UTF-8). Hay dos tipos de envío del formulario: application / x-www-forma-urlencoded que se utiliza para GET y de forma predeterminada para POST, y multipart / form-data que puede ser utilizado por POST, y es necesaria cuando se desea cargar archivos.

El siguiente es un resumen de notas de FORMA presentación y i18n. Dicho documento contiene una gran cantidad de información útil, pero está escrito de una manera rambly, asi que aquí trato de ir directo al punto. (Nota: el original ha desaparecido de la web, así que estoy enlazando a la copia del archivo de Web.)

application / x-www-form-urlencoded

Este es el tipo de contenido que debe utilizar peticiones GET, POST y pide a utilizar por defecto. Se trata de la omnipresente ciento formato de codificación que se ve algo como esto: % C3% 86. No hay manera oficial de determinar la codificación de caracteres de tal petición, puesto que la codificación por ciento opera a nivel de byte, por lo que generalmente se supone que es la misma que la codificación de la página que contiene el formulario se envió pulg (RFC 3986 recomienda que los identificadores textuales ser traducido a UTF-8, sin embargo, el cumplimiento es irregular navegador.) se encontrará con algunos problemas muy si sólo utiliza caracteres de la codificación de caracteres que usted eligió.

Sin embargo, una vez que comience a agregar caracteres fuera de su codificación (y esto es mucho más común que usted puede pensar: tomar rizado "tipográficas de Microsoft como un ejemplo), de manera entera de cosas extrañas comienzan a suceder. Dependiendo del navegador que utilice, puede ser que:

  • Vuelva a colocar los caracteres no compatibles con signos de interrogación inútil,
  • Tratar de solucionar los personajes (por ejemplo: las comillas tipográficas a las cotizaciones regulares),
  • Vuelva a colocar el personaje con una referencia a entidad de caracteres, o
  • Enviar de todos modos como un carácter diferente codificación mezclados con la codificación original (normalmente Windows-1252 en vez de iso-8859-1 o UTF-8 intercalados en 8-bits)

Para prevenir adecuadamente estas conductas, usted tendría para olfatear el agente del navegador, compilar una base de datos de distintas conductas, y tomar las medidas adecuadas contra la conversión de la cadena (sin tener en cuenta una serie de extremadamente misterioso, al azar y los insectos devastadores Internet Explorer se manifiesta cada vez en un tiempo). O usted podría utilizar UTF-8 y estar tranquilo sabiendo que nada de esto podría suceder desde UTF-8 apoya todos los personajes.

multipart / form-data

Formulario de presentación de Multiparte quita mucho de la ambigüedad que había por ciento de codificación: el servidor ahora puede pedir expresamente ciertas codificaciones, y el cliente puede saber de forma explícita el servidor durante el envío del formulario qué codificación los campos son pulg

Hay dos maneras de ir con esta funcionalidad: déjelo desconectado y que el navegador le enviará en la misma codificación que la página, o ponerlo a UTF-8 y luego hacer otro servidor de conversión a lado. Cada método tiene sus deficiencias, especialmente en la primera .

Si usted le dice al navegador que envíe el formulario en la misma codificación que la página, usted todavía tiene el problema de qué hacer con los personajes que están fuera del personaje de codificación de la gama. El comportamiento, una vez más, varía: Firefox 2.0, los convierte a las referencias de entidad de caracteres, mientras que Internet Explorer 7.0 les destroza más allá de la inteligibilidad. A efectos de la internacionalización en serio, esto no es una opción.

La otra posibilidad es establecer Accept-Encoding a UTF-8, que plantea la pregunta: ¿Por qué no está usted usando UTF-8 para todo, entonces? Esta ruta es más aceptable, pero hay una salvedad notable: sus datos se entran como UTF-8, por lo que tendrá que explícitamente convertirlo en su codificación de caracteres locales favorecidas.

Me opongo a este enfoque por motivos ideológicos: se trata de excavar más profundamente en sí mismo el agujero cuando podría haber sido la conversión a UTF-8 en su lugar. Y, por supuesto, no puede utilizar este método para las solicitudes GET.

Bien apoyado

Casi todos los navegadores modernos de hoy en el silvestre tiene plena UTF-8 y el soporte de Unicode: el número de casos problemáticos se pueden contar con los dedos de una mano, y estos navegadores suelen tener problemas con las codificaciones de caracteres de otros también. usuarios suelen encontrar problemas se derivan de la falta de fuentes adecuadas para mostrar a los personajes (una vez más, esto se aplica a todas las codificaciones de caracteres y entidades HTML) o el Explorador de Internet no tienen de escoger la fuente inteligente (que puede ser trabajado alrededor).

Vamos a entrar en más detalles acerca de cómo tratar los casos límite en el explorador del mundo en la sección de Migración, pero puede estar seguro que la conversión a UTF-8, si se hace correctamente, no dará lugar a los usuarios sobre las páginas que usted acoso roto.

Purificador HTML

Y, por último, llegamos a HTML purificador. Purificador HTML está construido para hacer frente a UTF-8: ninguna indicación de lo contrario son el resultado de un codificador que convierte el texto de la codificación deseada a UTF-8, y viceversa. Purificador HTML nunca toca nada más, y deja en manos de la iconv módulo para hacer el trabajo sucio.

Este enfoque, sin embargo, no es perfecto. iconv es alegremente inconscientes de las entidades de caracteres HTML. Purificador HTML, a fin de proteger frente a los sofisticados sistemas de escape, se normaliza todo carácter y entidad de las referencias numéricas antes de procesar el texto. Esto conduce a una ramificación importante:

Cualquier carácter que no es compatible con el juego de caracteres de destino, independientemente de si es o no en la forma de una referencia a entidad de caracteres o un carácter de prima, será ignorado.

Ejemplo de este principio en el trabajo: dicen que usted tiene θ en su HTML, pero la salida está en latín-1 (que, comprensiblemente, no entiende el griego), el proceso ocurrirá lo siguiente (suponiendo que haya establecido la codificación utilizando correctamente Core.Encoding%):

  • El codificador va a transformar el texto de la norma ISO 8859-1 a UTF-8 (theta en cuenta que se conserva aquí, ya que en realidad no utilizar cualquier ASCII no): θ
  • El EntityParser transformará todos los nombrados y entidades de carácter numérico para sus correspondientes primas UTF-8 equivalentes: θ
  • Purificador HTML procesa el código: θ
  • El codificador transforma ahora el texto de nuevo de UTF-8 a ISO 8859-1. Como el griego no es compatible con la norma ISO 8859-1, que se ignora o se sustituye con un signo de interrogación: ?

Este comportamiento es bastante insatisfactoria. Se rompe el acuerdo para las solicitudes internacionales, y puede ser ligeramente irritante para el alma de provincia que a veces necesita un carácter especial. Desde 1.4.0, HTML purificador ha dado un poco más digerible solución utilizando Core.EscapeNonASCIICharacters%. El proceso que ahora se ve así:

  • El codificador transforma codificación a UTF-ocho: θ
  • El EntityParser transforma entidades: θ
  • Purificador HTML procesa el código: θ
  • El codificador reemplaza todos los caracteres no ASCII con referencia a una entidad numérica: θ
  • En buena medida, codificador transforma de nuevo a la codificación original (que es absolutamente innecesario para el 99% de las codificaciones por ahí): θ (recuerde, todo es ASCII!)

... Lo que significa que sólo es bueno para uno alguna incursión por la tierra de caracteres Unicode, y es totalmente inaceptable que los textos chinos o japoneses. Cuanto más grande es el pateador aun es que, suponiendo que la codificación de entrada era en realidad la norma ISO-8859-7, que se theta de apoyo, el personaje se convierten en una referencia de entidad de caracteres de todos modos! (El codificador no discrimina).

La funcionalidad actual es acerca de dónde se Purificador HTML para el resto de la eternidad. Purificador HTML podría intentar conservar la forma original de las garantías de moralidad para que pudieran ser sustituido de nuevo, sólo la extensión DOM les mata de manera irreversible. Purificador HTML también podría intentar ser inteligentes y sólo convertir ASCII no que no recibieron el apoyo de la codificación de destino, pero eso requeriría iconv reimplementar con conocimiento de HTML, algo que no va a hacer.

Así que apoyo: o bien es UTF-8 o lisiados internacional. Su selección! (Y no estoy siendo sarcástico aquí: algunas personas podrían cuidar menos sobre otros idiomas).

Migrar a UTF-8

Por lo tanto, usted ha decidido hacer de tripas corazón, y quiere migrar a UTF-8. Tenga en cuenta que esto no es para los pusilánimes, y usted debe esperar que el proceso tome más tiempo del que cree que tomará.

La idea general es que convertir todos los textos existentes a UTF-8 y, a continuación se establece todos los encabezados y las etiquetas META hemos comentado anteriormente a UTF-8. Hay muchas maneras de ir sobre hacer esto: usted podría escribir un script de conversión que se ejecuta a través de la base de datos y todo lo re-codifica como UTF-8 o que puede hacer la conversión al vuelo, cuando alguien lee la página. Los detalles dependen de su sistema, pero voy a cubrir algunos de los puntos más sutiles de la migración que puede tropezar.

Configuración de la base de datos

La mayoría de las bases de datos modernos, el más prominente de código abierto MySQL están los 4.1 + y PostgreSQL, codificaciones de caracteres de apoyo. Si usted está cambiando a UTF-8, lógicamente hablando, usted quiere asegurarse de su base de datos sabe acerca del cambio también. Hay algunas advertencias sin embargo:

Legible método

Normalización en términos de sintaxis SQL para especificar codificaciones de caracteres es notoriamente irregular. Consulte la respectiva base de datos de documentación sobre la forma de hacer esto correctamente.

Para MySQL, ALTER por arte de magia realizar la codificación de caracteres de conversión para usted. Sin embargo, usted tiene que asegurarse de que el texto dentro de la columna es lo que se dice que es: si tiene que poner Shift-JIS en un ISO 8859-1 columna, MySQL irreversiblemente mangle en el texto cuando se intenta convertir a UTF- 8. Usted tendrá que convertir en un campo binario, lo convierten en un campo de Shift-JIS (la codificación real) y, finalmente, a UTF-8. Muchas páginas de un sitio web había destrozado irreversiblemente debido a que no se daba cuenta que había estado engañando a sí mismos acerca de la codificación de caracteres a lo largo; no se conviertan en la próxima víctima.

Para PostgreSQL, no parece haber forma directa a cambiar la codificación de una base de datos (a partir de 8,2). Usted tendrá que volcar los datos, y luego volver a importar en una tabla nueva. Asegúrese de que la codificación de su cliente se establece correctamente: así es como PostgreSQL sabe para llevar a cabo una conversión de codificación.

Muchas veces, usted será también preguntó sobre la intercalación "de la nueva columna. Colación es como un tipo de texto DBMS, como encargar B, C y A en A, B y C (el problema se complica cuando sorpresivamente se llega a idiomas como el tailandés y japonés). En caso de duda, ir con la configuración por defecto suele ser una apuesta segura.

Una vez que la conversión es todo dicho y hecho, todavía tiene que acordarse de establecer la codificación del cliente (la codificación) correctamente en cada conexión de base de datos usando SET NAMES (que es SQL estándar y es compatible por lo general).

Binario

Debido a los problemas de compatibilidad antes mencionados, una manera más interoperable de almacenar texto UTF-8 es meterlo en un tipo de datos binarios. CHAR se convierte en BINARIO, VARCHAR se convierte en VARBINARY y TEXTO convierte BLOB. Si lo hace, le puede ahorrar algunos dolores de cabeza enorme:

  • La sintaxis de los tipos de datos binarios es muy portátil,
  • MySQL 4.0 tiene ningún soporte para codificaciones de caracteres, así que si quieren el apoyo que han de utilizar binario,
  • MySQL, a partir de 5,1, no tiene soporte para cuatro bytes UTF-8 caracteres, que representan caracteres multilingües más allá del plano de base, y
  • Usted nunca tendrá que preocuparse por su DBMS ser demasiado inteligentes y tratar de convertir su texto cuando no se desea.

MediaWiki, una solicitud internacional importante, a la utilización campos binarios para el almacenamiento de sus datos a causa de tres puntos.

Hay desventajas, por supuesto:

  • herramientas de base de datos como PHPMyAdmin no será capaz de ofrecerle la edición de texto en línea, ya que se declara como binario,
  • No es semánticamente correcto: es realmente texto no binario (mentir a la base de datos),
  • A menos que utilice la-muy-portátiles de magia no mencionados anteriormente, usted tiene que cambiar la codificación a ti mismo (por lo general, usted tendría que hacer sobre la marcha), y
  • Usted no tendrá su cotejo.

Elija según sus circunstancias.

Editor de textos

Para obtener más orientado sistemas de archivo plano, a menudo tendrá la tarea de convertir pilas de texto existente y archivos HTML en UTF-8, así como asegurarse de que todos los nuevos archivos se cargó correctamente codificados. Una vez más, sólo puede señalar vagamente en la dirección correcta para convertir sus archivos existentes: asegúrese de copia de seguridad, asegúrese de usar iconv(), y asegúrate de saber lo que el personaje original de codificación de los archivos es (o son, según en la pulcritud de su sistema).

Sin embargo, puedo ofrecer un asesoramiento más específico sobre el tema de los editores de texto. texto Muchos editores han soporte Unicode irregular notoriamente. Para saber cómo su editor está haciendo, usted puede sacar de esta lista o la lista de Wikipedia. Yo personalmente uso Notepad + +, que funciona a las mil maravillas cuando se trata de UTF-8. Por lo general, se le que explícitamente dice el editor a través de algún tipo de diálogo (por lo general Guardar como o Format) lo codificación que desee utilizarlo. Un editor ofrecerán a menudo "Unicode" como método de ahorro, que es ambiguo. Asegúrese de saber si realmente quieren decir UTF-8 o UTF-16 (que es otro sabor de Unicode).

Las dos cosas a tener en cuenta son si o no el editor admite la mezcla de fuentes (fuentes múltiples en un solo documento) y si se añade una lista de materiales. Fuente mezcla es importante porque rara vez cuentan con fuentes de apoyo para todos los idiomas conocidos por la humanidad: el fin ser flexible, un editor debe ser capaz de tomar un poco de aquí y un poco de allí, de lo contrario todos los caracteres chinos vendrán como cuadros agradables. Discutiremos a continuación la lista de materiales.

Byte Order Mark (headers already sent!)

La lista de materiales, o Byte Order Mark, es una, invisible carácter mágico ubicado al comienzo de archivos UTF-8 para decirle a la gente cuál es la codificación es y lo que el orden de bytes del texto es. Tampoco es necesario.

Debido a que es invisible, a menudo las capturas la gente por sorpresa cuando se empieza a hacer cosas que no debería estar haciendo. Por ejemplo, este archivo PHP:

BUENAS index.php

... Un error con el demasiado familiar headers already sent error de PHP. Y debido a que la lista de materiales es invisible, esta culpable pasará desapercibida. Mi sugerencia es utilizar solamente caracteres ASCII en páginas PHP, pero si debe hacerlo, asegúrese de que la página se guarda la lista de materiales SIN.

Los encabezados que el error se refiere al son encabezados HTTP, que son enviadas al navegador antes de cualquier HTML para decirle diversa información. El momento en que cualquier texto normal (y sí una lista de materiales que se considera normal) es el texto, la producción, las cabeceras deben ser enviados, y no se les permite enviar más. Así, el error.

Si usted está leyendo en archivos de texto a insertar en el medio de otra página, se recomienda encarecidamente (pero no estrictamente necesario) que reemplace a cabo la secuencia de bytes-8 UTF para la lista de materiales "\ XeF \ XBB \ XBF" antes de colocarlo en , a través de:

$ texto = str_replace ("\ XeF \ XBB \ XBF",'', $ texto);

Fuentes

En términos generales, las personas que tienen problemas con las fuentes se dividen en dos categorías:

  • Aquellos que quieran utilizar un lenguaje extremadamente oscura para el que hay poco apoyo muy incluso entre hablantes nativos de la lengua, y
  • Aquellos en que el idioma principal del texto está bien soportado, pero hay personajes ocasionales que no son compatibles.

Sí, siempre hay una oportunidad en que un usuario en Inglés pasa a través de una página web cingaleses y no tiene la fuente correcta. Pero un usuario en Inglés, que no le sucede a la derecha dispone de las fuentes, probablemente no tiene por qué leer cingaleses de todos modos. Así que vamos a hacer frente a los casos extremos otros dos.

Oscuro scripts

Si ejecuta un sitio web bengalí, puede recibir comentarios de los usuarios que quieran leer su sitio web, pero llega montones de signos de interrogación u otros caracteres sin sentido. La fijación de este problema requiere la instalación de una fuente o un paquete de idioma que a menudo dependen en gran medida lo que el lenguaje es. He aquí un ejemplo de tal archivo de ayuda para el idioma bengalí, estoy seguro de que hay otros ahí fuera también. Sólo tienes que indicar a los usuarios el archivo de ayuda correspondiente.

Uso ocasional

Un buen ejemplo de cuándo vas a ver algunos caracteres Unicode muy oscuro incrustados en lo que de otro modo sería muy suave ASCII son letras del alfabeto fonético internacional (IPA), se utiliza para designar a pronunciaciones en una norma de manera muy (es muy probable verlos todo el tiempo en su diccionario). Su promedio de fuente probablemente no tendrá el apoyo de todos los personajes de la API como ʘ (click bilabial) o ʒ (con la voz fricativa postalveolar). Entonces, ¿qué es un navegador de pobres a hacer? Fuente combinación! navegadores inteligentes como Mozilla Firefox e Internet Explorer 7 será prestado glifos de otras fuentes con el fin de asegurarse de que todos los personajes se muestran correctamente.

¿Pero qué sucede cuando el navegador no es inteligente y resulta ser el navegador más utilizado en todo el mundo? Microsoft Internet Explorer 6 no es suficientemente inteligente como para pedir prestado a otras fuentes cuando un personaje no está presente, así que más a menudo que no se le dio una palmada con una grande y bonita. Para que las cosas funcionen, MSIE 6 necesita un pequeño empujón. Usted puede configurarlo para utilizar una fuente diferente para representar el texto, pero se puede lograr el mismo efecto mediante una selección de cambiar la fuente para los bloques de caracteres especiales para conocer buenas fuentes Unicode.

Afortunadamente, la gente encima en Wikipedia lo ha hecho todo el trabajo pesado para usted. Obtener el CSS de la boca caballos aquí: Common.css, y busque ". IPA" También hay un puñado de otras clases que puede utilizar para otros fines, echa un vistazo a esta página para más detalles. Para que los perezosos, esto debería funcionar:

. Unicode (font-family: Code2000, "TITO Cyberbit Básico", "Doulos SIL", "Chrysanthi Unicode", "Bitstream Cyberbit", "Bitstream Cyberbase", Thryomanes, Gentium, GentiumAlt, "Lucida Grande", "Arial Unicode MS "," Microsoft Sans Serif "," Lucida Sans Unicode ", familia /**/:-fuente heredar; / * restablece fuentes para todos, pero IE6 * /)

El uso estándar sigue la línea de Crazy Stuff Unicode aquí . Personajes en la Lista Glifo de Windows por lo general no tienen que ser fijos, pero para cualquier cosa que usted probablemente querrá ir a lo seguro. A menos, claro, no se preocupan por los usuarios de IE6.

Tratar con ancho variable en las funciones

Cuando la gente afirma que php6 va a resolver todos nuestros problemas Unicode, que están mal informados. No va a solucionar los problemas de las anteriores. Será, sin embargo, resolver el problema que vamos a discutir: procesamiento de texto UTF-8 en PHP.

PHP (a partir de PHP5) es alegremente ignorar la existencia de UTF-8 (con algunas excepciones notables). A veces, esto causará problemas, otras veces, esto no. Hasta ahora, hemos evitado discutir la estructura de UTF-8, así que, primero debemos preguntarnos, ¿qué es UTF-8? Sí, es compatible con Unicode, y sí, es de ancho variable. Otros rasgos:

  • byte de secuencia de caracteres Cada es única y nunca se encontró dentro de la secuencia de bytes de otro carácter,
  • UTF-8 puede utilizar hasta cuatro bytes para codificar un carácter,
  • Texto UTF-8 se analizará para buscar de buena formación,
  • ASCII puro es también válido UTF-8, y
  • clasificación binaria ordenará UTF-8 en el mismo orden como Unicode.

Cada una de estas características afectan a distintos ámbitos de procesamiento de textos de diferentes maneras. Está más allá del alcance de este documento para explicar lo que precisamente estas implicaciones. PHPWact proporciona un muy buen documento de referencia sobre qué esperar de cada función, aunque la cobertura es irregular en algunas zonas. Sus notas más general sobre los conjuntos de caracteres también vale la pena mirar para obtener información sobre UTF-8. Algunas reglas de oro cuando se trata de texto Unicode:

  • No NUNCA utilizar las funciones que:
    • ...convert case (strtolower, strtoupper, ucfirst, ucwords)
    • ... Dicen ser entre mayúsculas y minúsculas (str_ireplace, stristr, strcasecmp)
  • Piense dos veces antes de usar las funciones que:
    • ... Count caracteres (strlen volverá bytes, no caracteres; str_split y word_wrap podría corromper)
    • ... Convertir los caracteres en las referencias a entidades (UTF-8 no necesita entidades)
    • ... No muy compleja cadena de la transformación (* printf)

Nota: esta lista se aplica a UTF-8 sólo texto codificado: si usted tiene una cadena que esté 100% seguro es ASCII, ser mi huésped y el uso strtolower (HTML Purifier utiliza esta función.)

De todos modos, siempre pienso en bytes, no caracteres. Si usted usa strpos () para encontrar la posición de un personaje, que será en bytes, pero esto generalmente no importa desde substr () también funciona con los índices de byte!

También deberá asegurarse de que su UTF-8 está bien formado y probablemente necesitará reemplazos para algunas de estas funciones. Le recomiendo usar Harry Fuecks ' PHP UTF-8 biblioteca, en lugar de utilizar mb_string directamente. Purificador HTML también define unos cuantos útiles UTF-8 funciones compatibles: echa un vistazo a Encoder.php en la biblioteca / / HTMLPurifier / directorio.

Bueno, eso es todo. Esperemos que este documento ha servido como un trampolín muy práctica en el conocimiento de cómo funciona UTF-8. Usted tal vez ha decidido que no desea migrar aún: está bien, sólo sé lo que pasará con su salida y lo que los informes de errores que puede recibir.

Muchos otros desarrolladores ya han discutido el tema de Unicode, UTF-8 y la internacionalización, y me gustaría aplazar a ellos por una profunda mirada más en los juegos de caracteres y codificaciones.


No hay comentarios: