PHP: проблемы вывода utf8 из базы данных MySQL с использованием 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("<br><br>"); foreach($snapshotListing as $chat) { echo "<i>" . " " . "[" . strftime("%H:%M:%S", $chat['tstamp']) . "]" . "</i> " . " ><u>" . $chat['channel'] . "</u>< " . "(<b>" . htmlspecialchars($chat['nick'])."</b>) ".htmlspecialchars($chat['message']); echo("<br>"); } 

Этот фрагмент кода предназначен для анализа и вывода данных IRC, которые были сохранены в UTF-8, но при эхо-сигнале любое содержимое юникода просто отображается как:

 ?????? 

Я рассмотрел несколько вопросов и включил несколько предполагаемых исправлений, но ничего не работает. Другой скрипт, использующий одну и ту же базу данных, отлично отражает содержимое UTF-8, но использует стандартную MySQL-реализацию PHP, а не PDO. Что я делаю не так?

При работе с UTF8 существует несколько точек отказа:

  • убедитесь, что таблица utf8

    Использовать Show Variables; SQL-Command Show Variables; для проверки параметров символа MySQL для таблицы.

  • вставленные данные – utf8

    Вы можете попробовать такие инструменты, как phpMyAdminer или Adminer, чтобы проверить,
    данные вставлены правильно. Попробуйте вставить данные с помощью инструмента вручную. При вставке через скрипт не используйте базовые строковые функции. Всегда используйте их альтернативы mbstring. Установите mb_internal_encoding( 'UTF-8' ); чтобы PHP обрабатывал UTF-8 внутренне.

  • Полученные данные – utf8

    Я бы использовал только $pdo->exec("SET NAMES utf8"); и бросить все остальное. Поскольку SET NAMES x эквивалентен 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;

  • отображаемые данные – utf8

    Если это отображается на странице html, не забудьте установить метатег или заголовок
    "Content-Type: text/html; charset=utf-8" .