Problemas con acentos y eñes

Alguna vez les ha pasado que revisando la información desde la misma BD, con phpMyAdmin por ejemplo, encuentran que los datos están almacenados correctamente, contiene los acentos y las eñes, pero al momento de extraer la información desde PHP esta se muestra con símbolos raros en lugar de los caracteres especiales ?

Pues bienvenido al club de los desconcertados. Seguramente se te ocurrió añadir funciones las funciones uff8_encoder() y uft8_decoder() según el caso, solucionando "momentaneamente" el problema, solo para darte cuenta luego que la cagaste peor aun.

1. Como esta configurado MySQL ?

Para saber como esta configurado tu MySQL hay que entrar en phpMyAdmin y desde la ventana Variables usa filtro para ver los valores de las variables referidas a character y collation, si están distintas allí esta el problema. Si no tienes acceso a la ventana de variables usa la ventana SQL y escribe show variables.

character-set-server --> utf8
collation-server --> utf8_spanish_ci

character_set_server --> latin1
collation_server --> latin1_swedish_ci

2. Como esta configurado tu HTML ?

En tu archivo HTML bajo la etiqueta HEAD debes poner <Meta CharSet='UTF-8' />

<!DOCTYPE html>
<HTML lang="es">
<HEAD>
   <META CharSet='UTF-8' />
   <TITLE>Manual PHP</TITLE>
    ...
</HEAD>

<BODY>
    ...
</BODY>
</HTML>

3. Como esta configurado tu PHP ?

Si tu archivo en PHP puro debes añadir la linea

header("Content-Type: text/html;charset=utf-8");

4. Como esta la cadena de conexion con MySQL ?

En la cadena de conexion de MySQL añade esto según si usa MySQL o MySQLi

mysql_query("SET NAMES 'utf8'");

$db->query("SET NAMES 'utf8'");

5. Tu tabla no quedo bien ?

Si alguna de tus tablas no quedo bien luego de los cambios, aun la puedes salvar con el siguiente comando. Convierte caracteres latin1 a UTF-8.

SELECT convert(cast(convert(content using latin1) as binary) using utf8) AS content