2010-03-24

Problema con PHP y json_encode() por ISO-8859-1 y UTF-8 con letras como Ñ á é í ó ú

Escapar caracteres especiales en cadenas JSON

En la notación JSON se utiliza Unicode como juego de caracteres, por su universalidad. Por tanto, en Unicode hay determinados caracteres, como pueden ser la eñe, letras con acentos, etc, que tienen que convertirse en sus correspondientes códigos de escape para que todo funcione correctamente. Por ejemplo, la letra "ñ" tiene el código "u00f1". En las cadenas que utilizamos en la notación JSON se deben colocar entonces caracteres Unicode, excepto las comillas dobles (que se utilizan para delimitar la cadena y por tanto se debe escapar) y la barra invertida, que es el carácter de escape.

Afortunadamente, la función PHP json_encode() hace la conversión de las cadenas a Unicode automáticamente, por lo que no nos deberíamos preocuparnos por este detalle, sin embargo, PHP toma de manera predeterminada que la cadena de origen está en UTF-8, por lo que, si trabajamos con archivos en ISO-8859-1, tendremos que convertirlos antes a UTF-8.

Por ejemplo, en mi ejemplo PHP, que tengo en mi ordenador guardado con ISO-8859-1, si intento crear un JSON de esta manera:

$miArray = array("París"=>"Francia", "Madrid"=>"España");
print_r(json_encode($miArray));

Obtengo la siguiente cadena:

{null:"Francia","Madrid":null}

Esto se soluciona, como digo, convirtiendo antes las cadenas a UTF-8, al menos las que tienen caracteres distintos del alfabeto inglés.

< ? php $miArray = array(utf8_encode("París")=>"Francia", "Madrid"=>utf8_encode("España"));
print_r(json_encode($miArray));
? >

Con lo que obtengo la siguiente cadena codificada con JSON:

{"Paru00eds":"Francia","Madrid":"Espau00f1a"}

Con este artículo de desarrolloweb .com ya hemos visto cómo podemos producir cadenas con notación JSON a partir de variables, arrays u objetos. Esperamos que haya sido instructivo y os citamos para el próximo artículo, en el que veremos cómo crear variables u objetos PHP a partir del contenido de cadenas JSON.

Mas Info: Link

3 comentarios:

Joaquin dijo...

Y después que obtienes {"Paru00eds":"Francia","Madrid":"Espau00f1a"} como haces para que se visualicen correctamente?

Autor dijo...

Lo contrario:

< ? php $miArray = array(utf8_decode("Paru00eds")=>"Francia", "Madrid"=>utf8_decode("Espau00f1a"));

print_r(json_encode($miArray));
? >

Listo eso es todo = te recomiendo no utilizar letras con letras como Ñ á é í ó ú etc.. sobre los index de los array esto su a modo de ejemplo pero no es bueno utilizarlas.
Saludos

Malcom dijo...

Hola llegue a este post buscando otra cosa. Deberías convertirlo recursivamente sino estarías poniendo utf8_encode a mano..
Deberias usar array_map de esta manera:

array_map(“utf8_encode”, $miArray);

y listo despues podes transformarlo.
Espero le sirva a alguien. Saludos!