A mi siempre me falla utilizando el utf8 como meta tag y header en php, siempre pongo el ISO-8859-1 y vualá los carácteres con acento o con símbolos especiales se muestran.
Mira si tu configuración es la predeterminada en php, observa el siguiente detalle.
Código PHP:
<?php
header("Content-type:text/html;charset=utf-8"); // Si tú usas utf-8 en el header tendrás que codificar los carácteres
$nombre="¿Cuándo?, ¿Dónde?, ¿Quién?, Alberto Ñuñes";
echo utf8_encode($nombre); // $nombre es codificado y la salida es ¿Cuándo?, ¿Dónde?, ¿Quién?, Alberto Ñuñes
echo $nombre; // La salida es �Cu�ndo?, �D�nde?, �Qui�n?, Alberto �u�es por que no fué codificado
?>
En cambio si tu usas ISO-8859-1 como a continuación.
Código PHP:
<?php
header("Content-type:text/html;charset=ISO-8859-1"); // Aquí se usa el ISO-8859-1 lo cuál no es necesario codificar nada
$nombre="¿Cuándo?, ¿Dónde?, ¿Quién?, Alberto Ñuñes";
echo $nombre; // La salida es ¿Cuándo?, ¿Dónde?, ¿Quién?, Alberto Ñuñes y nisiquiera se necesito codificar
?>
Solamente cuándo obtienes datos de otro lugar que no sea de tus documentos PHP con estandar ISO-8859-1 necesitas "decodificar" los datos con utf8_decode().
Código PHP:
<?php
header("Content-type:text/html;charset=ISO-8859-1");
$nombre="¿Cuándo?, ¿Dónde?, ¿Quién?, Alberto Ñuñes"; // Supuestamente es obtenido de MySql
echo utf8_decode($nombre); // La salida es ¿Cuándo?, ¿Dónde?, ¿Quién?, Alberto Ñuñes usando utf8_decode()
?>