Formularios y juego de caracteres
¿A quién que haya programado un sitio web no le ha ocurrido que en el texto aparecieran caracteres extraños en lugar de vocales con tilde y eñes? Pues eso se debe al uso de distintos juegos de caracteres entre las distintas partes que componen nuestro sitio. Lo más normal es entre el Sistema Gestor de Bases de Datos y los archivos de script, pero hay más casos, como el envío asíncrono de datos mediante JavaScript.
La recomendación es utilizar UTF8 en todos los casos, esto nos quitaría gran cantidad de problemas. Sin embargo debemos tener especial cuidado en la codificación de los archivos de copia de seguridad, ya que al recuperar los datos pueden hacer un estropicio importante; e incluso la que utilizan los programas de gestión adicionales que utilicemos (PHPMyAdmin, MySQL Query Browser, etc).
Igual de importante es la codificación utilizada en los archivos que componen nuestro sitio (.htm, .php, .js, .css…), ya que un archivo codificado en ANSI, Unicode o UTF8 y mostrado en una codificación diferente nos mostrará caracteres raros igualmente. Así pues si nuestro sitio está completamente realizado con un juego de caracteres ISO, utilizaremos ficheros ANSI; y UTF8 con su par. Mi experiencia con Unicode ha sido de auténticos dolores de cabeza, de modo que no recomiendo su uso, al menos para trabajar con páginas en español.
El software de edición debe tener la posibilidad de trabajar con distintas codificaciones, hasta si eres un masoquista y utilizas el bloc de notas de MS-Windows tienes esta posibilidad en “Guardar como…”.
Ahora bien ¿qué ocurre al transferir datos de un script a otro? Pues lo mismo, ambos deberían tener la misma codificación. No obstante en PHP disponemos de las funciones utf8_encode y utf8_decode, siempre que el cambio sea entre UTF-8 e ISO-8859-1. Estas funciones nos serán muy útiles a la hora de recodificar los datos recibidos para alojarlos en la base de datos con el juego de caracteres adecuado. También nos serán útiles cuando los datos los recibimos de otro sitio web sobre el que no tengamos control.
Existe una problemática adicional cuando trabajamos con ISO-8859-1 y enviamos los datos mediante AJAX, ya que siempre se envían en UTF.
Como recomendación adicional, especificar el juego de caracteres utilizado tanto en las cabeceras de HTML como en la del documento mediante PHP, ya que el servidor web por defecto enviará las establecidas. Por ejemplo MS-IIS por defecto informa que se usa el juego de caracteres ISO-8859-1.
<?php
header ("Content-type: text/html; charset=UTF-8");
?>
<html>
<head>
<meta http-equiv="Content-type" content="text/html; charset=UTF-8" />
<title>ejemplo</title>
</head>
<body>
...
</body>
</html>
Por último, para una reconversión de los datos recibidos, podemos utilizar un sencillo bucle:
foreach ($_POST as $key => $val)
$$key = utf8_decode($val);
Si además esos datos los vamos a incluir en una consulta MySQL:
foreach ($_POST as $key => $val)
$$key = mysql_real_esacape_string(utf8_decode($val));
Espero que sea de utilidad.
