PHP:使用PDO从MySQL数据库输出utf8的问题

Eph*_*lis 3 php mysql unicode pdo utf-8

$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>");
}
Run Code Online (Sandbox Code Playgroud)

这段代码应该解析并输出已存储在UTF-8中的IRC数据 - 但是在回显时,任何unicode内容只显示为:

??????
Run Code Online (Sandbox Code Playgroud)

我已经回顾了几个问题并包含了一些声称的修复,但似乎没有任何效果.使用相同数据库的另一个脚本完美地回应了UTF-8内容,但它使用的是PHP的标准MySQL实现,而不是PDO.我究竟做错了什么?

Jen*_*och 11

使用UTF8时有多个故障点:

  • 确保表格是utf8

    使用SQL-Command 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页面中,请不要忘记设置元标记或标题
    "Content-Type: text/html; charset=utf-8".

  • 谢谢你`$ pdo-> exec("SET NAMES utf8");`.它解决了我的问题 (3认同)