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コンテンツを完全にエコーしますが、PDOではなくPHPの標準のMySQL実装を使用しています。私は何が間違っているのですか?

4

1 に答える 1

11

UTF8を使用する場合、複数の障害点があります。

  • テーブルがutf8であることを確認してください

    SQL-CommandShow 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"

于 2012-07-10T12:24:14.510 に答える