$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"
.