Problemas de codificación de caracteres en PHP

A veces, desarrollando webs, se muestran mal los caracteres acentuados, eñes, diéresis, cedillas, y otros pertenecientes a otros idiomas.

No siempre es evidente dónde se encuentra el problema, ya que se pueden producir errores de codificación en la base de datos, en el php, en el cliente web, en los propios ficheros de texto que contienen el PHP, y lo mismo en algún sitio más.

En cualquier caso, a veces viene bien «ver» los bytes exactos que contiene el string que estamos manejando en PHP, porque así podemos saber en qué está codificado. Para eso, siempre utilizo este trozo de código como una traza:

———-8<———-8< ———-8< ———-
$string_sospechosa = $variable_que_contiene_el_string_a_analizar;
for($x=0; $x < strlen($string_sospechosa); $x++) {
echo dechex(ord(substr($string_sospechosa, $x, 1))), » – «;
}
———-8<———-8< ———-8< ———-

De esta forma, vemos qué bytes (en hexadecimal) tiene un determinado string.

Pero una vez que vemos los bytes del string, necesitamos tener a mano información sobre UTF-8 y sobre ISO-8859-1, y para eso entre otras páginas, se puede encontrar la información aquí:

– UTF-8: http://www1.tip.nl/~t876506/utf8tbl.html

– ISO-8859-1: http://casa.colorado.edu/~ajsh/iso8859-1.html

NOTA importante:

En general, para que todo funcione bien sin importar el idioma, hay que:

– hacer que el cotejamiento de la base de datos sea siempre UTF-8.

– los ficheros .php del web deben estar codificados en UTF-8.

– hay que indicar en el HTML generado, que el propio HTML está codificado en UTF-8 mediante el meta:

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

– y hay que decirle al navegador que interprete todo lo que recibe como UTF-8 (menú «view / character encoding / Unicode UTF-8)

– … y rezar.

NOTA sobre IExplorer, UTF-8 y AJAX:

Si se envía un string como parámetro a una página mediante AJAX, es importante que el envío de los parámetros en la llamada HTTPRequest se haga por POST, porque si se hace por GET, el IExplorer cambia la codificación de los parámetros y en el PHP llamado, al recibir los parámtros, estos llegan corrompidos.

El Firefox lo hace bien tanto por GET como por POST, así que… instálate Firefox 🙂