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: ,,,

Comments

Comment from charlie
Time September 29, 2008 at 7:31 am

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

Comment from Pablo Viquez
Time September 29, 2008 at 11:57 am

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

Comment from BRABDO
Time February 25, 2009 at 5:05 am

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????

Comment from BRABDO
Time February 25, 2009 at 5:06 am

el codigo es el siguiente:

Comment from BRABDO
Time February 25, 2009 at 5:07 am

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

Comment from Pablo Viquez
Time February 26, 2009 at 3:04 pm

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.

Comment from Tp_spider
Time July 17, 2009 at 9:22 am

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.

Comment from Pablo Viquez
Time July 17, 2009 at 4:40 pm

Gracias!, me alegro que te halla servido.

Pablo

Pingback from problema con constructor require – Foros de CHW
Time March 26, 2010 at 10:39 pm

[...] [...]

Write a comment