PHP:使用PDO从MySQL数据库输出UTF8时遇到问题

3
$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>");
}

这段代码的作用是解析并输出存储在UTF-8中的IRC数据 - 但是在回显时,任何Unicode内容都只会显示为:

??????

我已经查看了几个问题并包含了几个所谓的修复方法,但是似乎没有任何作用。另一个使用相同数据库的脚本完美地回显UTF-8内容,但它使用的是PHP的标准MySQL实现,而不是PDO。我做错了什么?


你确定这不是客户端问题吗?Content-Type头正确吗? - Sergey Eremin
通用故障排除指南:在Web应用程序中处理Unicode前后 - deceze
除了kgb的提示,还可以看看这里:https://dev59.com/LnI_5IYBdhLWcg3wAeLl。这可能是一个好的开始...你的PDO/exec调用中可能会重置你的UTF8设置。 - Andreas W. Wylach
1个回答

11

在使用UTF8时存在多个故障点:

  • 确保表格采用utf8

    使用SQL命令Show Variables;检查MySQL表的字符设置。

  • 插入的数据是utf8

    您可以尝试使用phpMyAdminerAdminer等工具检查数据是否被正确插入。尝试通过工具手动插入数据。当通过脚本插入时,不要使用基本字符串函数。始终使用其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"


表格排序规则为utf8,插入其中的数据也是utf8格式,获取的数据同样为utf8,页面中同时设置了utf-8头部和utf8的html元标签,但仍然没有成功。 - Ephemeralis
取消之前的操作,客户端未正确提交UTF8数据。 - Ephemeralis
3
感谢 $pdo->exec("SET NAMES utf8");。它解决了我的问题。 - Mohammad Saberi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接