Pablo Viquez Blog » Encoding, UTF-8, ISO 8859-1 y PHP

Pablo Viquez Blog » Encoding, UTF-8, ISO 8859-1 y PHP.

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.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *