$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("
");
}
这个代码片段应该用来解析和输出存储在utf-8中的irc数据,但是在回显时,任何unicode内容都会显示为:
??????
我已经回顾了几个问题,包括几个声称的修复,但似乎没有工作。另一个使用相同数据库的脚本完美地响应了utf-8内容,但它使用的是php的标准mysql实现,而不是pdo。我做错什么了?
最佳答案
使用UTF8时,存在多个故障点:
确保桌子是utf8
使用sql命令Show Variables;检查表的mysql字符设置。
插入的数据是utf8
如果
数据已正确插入。尝试通过工具手动插入数据。
通过脚本插入时,不要使用基本字符串函数。总是使用它们的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;
显示的数据是utf8
如果这是在html页面中显示的,不要忘记设置meta标记或头
"Content-Type: text/html; charset=utf-8"