Pablo Viquez Blog

Mi vida y cosas relacionadas

Skip to: Content | Sidebar | Footer

Encoding, UTF-8, ISO 8859-1 y PHP

4 September, 2008 (17:01) | PHP, Web Development | By: Pablo Viquez

Hace unos dias tuve un problema tratando de desplegar tildes en una aplicación, el problema surgió cuando quise hacer que toda la aplicación fuera UTF-8.

Es decir, que la DB hablara UTF-8 y las paginas desplegaran UTF-8:

<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8">
 

Ahora, cuando hice el despliegue en la página, en vez de ver caracteres con tildes o signos de puntuancion de un lenguaje específico, no se desplegaban sino que mostraban caracteres extraños.

Despues de buscar e investigar, mi conclusión fue la siguiente:

Basicamente, los archivos de texto pueden tener diferentes "encodings" y asi reaccionan las funciones.

Por ejemplo, la función utf8_decode, convierte los datos pasados por parametro de tipo multy-byte UTF-8 a un single-byte de tipo ISO-8859-1.

Ahora la funcion utf8_encode funciona bien con un archivo guardado con encoding ANSI, PERO si aplicamos la misma funcion con archivo de tipo UTF-8, nos despliega caracteres extraños en las tildes y ñ’s. Esto porque la funcion espera un parametro de tipo ISO-8859-1 y le estamos pasando uno de tipo UTF-8.

Anyway, ¿porque es importante? por lo siguiente:

Si deseo escribir un archivo en español usando UTF-8, y guardo el archivo en ANSI, los caracteres se van a desplegar de una manera extraña.

Ahora bien, si guardo los archivos fisicamente usando UTF-8, al ser multi-byte el encoding del archivo, los caracteres en español se desplegarán correctamente.

A todo esto, una funcion que sirve mucho si desea hacer la conversion explicita es "iconv"

Funcion: iconv

Uso: string iconv (string in_charset, string out_charset, string str)

Propósito: Convierte un string al encoding solicitado

Ejemplo:

<?php echo iconv('ISO-8859-1', 'UTF-8', 'á'); ?> 

En un archivo guardado fisicamente como ANSI, funciona bien, PERO en un archivo guardado como UTF-8 va a desplegar un caracter extraño.

Ahora hay que tener cuidado, ya que si hacemos esto:

<?php echo iconv('UTF-8', 'ISO-8859-1', 'á'); ?> 
 

En un archivo ISO-8859-1, nos genera un error "Notice", porque esta esperando un string de tipo multi-byte, y le estamos pasando un string single-byte, debido al encoding del archivo PHP.

Por último, solo para probar el concepto:

En un archivo guardado como ANSI:

<?php echo ord('á'); ?> 

Retorna, 255

En un archivo guardado como UTF-8:

<?php echo ord('á'); ?> 

Retorna, 195

Dentro del zip file hay 2 archivos PHP, los 2 con el mismo contenido, la diferencia es el Encoding que use para guardar los archivos.

Resumen y conclusión

Si se trabaja con páginas donde el charset va a ser "ISO 8859-1"

<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=ISO-8859-1">

Asegurese de guardar los archivos fisicos PHP o HTML con un formato compatible tipo ANSI.

PERO si las paginas van a tener un charset distinto como UTF-8:

<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8">

El archivo físico debe ser guardado con el encoding UTF-8.

Technorati Tags: ,,,

  • charlie

    Muy interesante toda esta problemática relacionada con la codificación. Creo que existe una gran confusión de todo lo que significa la codificación y la internacionalización, sobre todo entre los que nos movemos al márgen del desarrollo. Sería interesante hacer un manual, o un pequeño artículo explicando en qué consiste todo ésto, posibles problemas y como atacarlas. Gracias

  • http://www.pabloviquez.com Pablo Viquez

    Cierto, buen tip. Muchas personas tiene el mismo problema, asi que hacer un pequeño “how to / como hacer” seria muy bueno.

  • BRABDO

    Hola tengo un gran problema estoy realizando una sitio web con XML y FLASH y todo va bien pero al publicar la pagina no se ven las letras con tilden ni las Ñ y otros caracteres del idioma español el codigo es el siguiente:

    content/logo.png

    <![CDATA[Creado por xxxxxx xxxx xxx D.G.]]>

    que puedo hacer, cual es mi error????

  • BRABDO

    el codigo es el siguiente:

  • BRABDO

    que puedo hacer, cual es mi error????

  • http://www.pabloviquez.com Pablo Viquez

    No soy experto en Flash, pero al parecer el problema esta en la codificación de FLASH. SI el XML esta en ISO-8859-1 y FLASH tiene un set de caracteres igual, no deberia dar problema. En cambio si el XML esta en UTF-8, unicode o cualquier otro diferente al set de caracteres que tiene FLASH te daria problemas.

  • http://www.herramientaswebmaster.com Tp_spider

    Muy buen articulo, si señor!!
    Me ha venido de perlas, tenía problemas con los caracteres al mostrar contenido de un Foro Smf en una Web hecha en joomla, lo que he hecho es utilizar esta opción para convertir el texto a Utf8 en el momento de mostrarlo, ahora todo se vé correctamente.
    Te doy las gracias Pablo.

    • http://www.pabloviquez.com Pablo Viquez

      Gracias!, me alegro que te halla servido.

      Pablo

  • Pingback: problema con constructor require - Foros de CHW