PHP: problemas de salida de utf8 de la base de datos MySQL con PDO

$dbo = new PDO("mysql:host=localhost;dbname=database", "databaseuser", "databasepassword", array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8")); $dbo -> exec("set character_set_client='utf8'"); $dbo -> exec("set character_set_results='utf8'"); $dbo -> exec("set collation_connection='utf8_general_ci'"); $prepSnapRetrieve = $dbo->prepare( "SELECT * FROM znc_log WHERE `nick` LIKE :u AND `tstamp` BETWEEN :t1 AND :t2" ); $prepSnapRetrieve->execute(array(':u' => str_replace("|osu","", $_GET['u']), ':t1' => $_GET['sns'], ':t2' => $_GET['sne'])); $snapshotListing = $prepSnapRetrieve->fetchAll(); echo("Snapshot of ".$_GET['u']. "'s chat on ".strftime("%e/%m/%g",$_GET['sne'])); echo("

"); foreach($snapshotListing as $chat) { echo "" . " " . "[" . strftime("%H:%M:%S", $chat['tstamp']) . "]" . " " . " >" . $chat['channel'] . "< " . "(" . htmlspecialchars($chat['nick']).") ".htmlspecialchars($chat['message']); echo("
"); }

Se supone que este fragmento es un código para analizar y generar datos IRC que se almacenaron en UTF-8, pero al hacer eco, cualquier contenido Unicode simplemente aparece como:

 ?????? 

He revisado varias preguntas e incluido varias supuestas correcciones, pero nada parece funcionar. Otro script que utiliza la misma base de datos repite perfectamente el contenido UTF-8, pero está utilizando la implementación estándar de MySQL de PHP, y no PDO. ¿Qué estoy haciendo mal?

Hay varios puntos de falla cuando se trabaja con UTF8:

  • asegúrese de que la mesa sea utf8

    Usar SQL-Command Show Variables; para verificar la configuración de los caracteres MySQL para la tabla.

  • los datos insertados son utf8

    Puede probar herramientas como phpMyAdminer o Adminer para verificar, si
    los datos se insertan correctamente Intente insertar datos a través de la herramienta manualmente. Cuando inserte a través de una secuencia de comandos, no use funciones de cadena básicas. Siempre use sus alternativas mbstring. Establezca mb_internal_encoding( 'UTF-8' ); para permitir PHP manejar UTF-8 internamente.

  • datos obtenidos es utf8

    Solo usaría $pdo->exec("SET NAMES utf8"); y deja el rest. Porque SET NAMES x es equivalente a SET character_set_client = x; SET character_set_results = x; SET character_set_connection = x; SET character_set_client = x; SET character_set_results = x; SET character_set_connection = x;

  • los datos mostrados son utf8

    Si esto se muestra en una página html, no se olvide de configurar la metaetiqueta o encabezado
    "Content-Type: text/html; charset=utf-8" .