jueves, 25 de junio de 2009

Problemas de codificación UTF-8, ISO-8859-1

Recientemente me he tenido que pelear seriamente con el problema de las codificaciones. Y es que para todos aquellos que no hablamos la lengua de Shakespeare se nos plantean dificultades en el mundo de la informática.

Aforturnadamente poco a poco se van superando, pero claro uno que nunca se había encontrado con este problema, debido a que llevaba cuidado en todo lo que hacía ha visto como al descuidarse un poco puede tener un serio problema.

Pues bien, dependiendo de sí el charset del html es UTF-8 o ISO-8859-1 la cosa puede cambiar y de que manera.

Charset UTF-8:

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />


Charset ISO-8859-1:

<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1"/>


Por ejemplo con la primera línea, estamos diciendo que el documento está codificado como UTF-8. Esto significa que todas las tildes y caracteres no anglosajones estarán disponibles cuando visualicemos la página web. En la segunda línea esto no será así y dónde hayan tildes o caracteres no anglosajones saldrá el siguiente carácter:

Carácter no reconocido.



A continuación voy a poner el código php que prueba este ejemplo. Imaginad que en la cabecera de nuestro documento HTML hemos definido la codificación como UTF-8.

El siguiente código sacaría por pantalla este resultado:

<?php
$cadena= 'Mañana iré al cine';
$utf= utf8_decode($cadena);
$cad= utf8_encode($utf);
echo $cadena;
echo "<br/>";
echo $utf;
echo "<br />";
echo $cad;
?>


Codificación UTF-8



La primera línea muestra la cadena tal cual la tenemos. Es decir como el documento esta codificado en UTF-8 la cadena se muestra correctamente. En la segunda línea al llamar a la función utf8_decode($cadena); lo que estamos haciendo es pasar una cadena de UTF-8 a ISO-8859-1, de ahí que no se visualicen correctamente ni la "ñ" ni la "í".

Un consejo os doy. Utilizad UTF-8, pero si el sistema no lo permite tened en cuenta que con encode y decode de php podemos manejar el asunto.




Escuchando... The Cure -- Pictures of You
[kml_flashembed movie="http://www.youtube.com/v/kcMEx4OHLOs" width="425" height="350" wmode="transparent" /]

8 comentarios:

  1. Gracias m,uy buena solucion, sin problemas....

    ResponderEliminar
  2. De nada, a ver si ahora que estoy aterrizando de nuevo al trabajo a ver si me pongo las pilas de nuevo.

    ResponderEliminar
  3. Aunque el utf8_en/decode funciona, en algún caso concreto para otras codificaciones usé "iconv".

    ej:
    iconv("CP1252", "UTF-8", $texto);

    ResponderEliminar
  4. En realidad, si bien hay algo de razon en esto, lo que importa es ser coherente con el sistema con el que se guarda el archivo y con el sistema que se dice que se va codificar la pagina.
    Si los archivos los grabamos en UTF-8 pero en el content-type ponemos que el charset es ISO vamos a tener problemas de compatibilidad. Lo mismo sucede al revez.
    Depende que usen para crear los archivos podran ver las posibilidades. Con el block de notas si van a guardar como veran como hay varios formatos para un archivo de texto.
    Lo ideal es adoptar un formato y mantenerlo. El UTF tiene como ventaja que en general tiene mejor soporte para script y aplicaciones que se usen de terceros, que en general no son de habla hispana.
    Espero no confundir a nadie y gracias por la info

    ResponderEliminar
  5. Como bien dices, la codificación del fichero influye y el charset también.

    ResponderEliminar
  6. Gracias! me estaba volviendo loco con el problema de los acentos.

    ResponderEliminar
  7. Buenos días iRock,

    En realidad estás equivocado cuando dices que la ISO 8859-1 (Conocida también como latin1) no muestra los acentos.

    ISO 8859-1 es una norma de la ISO que define la codificación del alfabeto latino, incluyendo los diacríticos (como letras acentuadas, ñ, ç), y letras especiales (como ß, Ø). (Ref. Wikipedia)

    Es decir, que la ISO 8859-1 no sólo SÍ que muestra los acentos. Es que además, está pensada para eso :D

    P.D: Buen Blog :-)

    ResponderEliminar