Pablo Viquez Blog » Encoding, UTF-8, ISO 8859-1 y PHP.
Encoding, UTF-8, ISO 8859-1 y PHP
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