2012-07-10 101 views
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>"); 
} 

該片段的問題是代碼應該解析和已經存儲在輸出IRC數據UTF-8 - 但在呼應,任何Unicode內容簡單地顯示爲:PHP:從MySQL數據庫輸出UTF8使用PDO

?????? 

我已經回顧了幾個問題,幷包含了幾個聲稱的修復程序,但似乎沒有任何工作。另一個使用相同數據庫的腳本完美地迴應了UTF-8的內容,但它使用PHP的標準MySQL實現,而不是PDO。我究竟做錯了什麼?

+0

您確定這不是客戶端問題嗎? Content-Type頭是否正確? – 2012-07-10 11:59:00

+0

一般疑難解答指南:[在Web應用程序中處理Unicode前後](http://kunststube.net/frontback/) – deceze 2012-07-10 11:59:43

+0

除了從kgb提示看看這裏http://stackoverflow.com/questions/1566602/IS-設置字符集-UTF8-必要的。可能是一個很好的開始......你的UTF8設置可能會在你的PDO/exec調用中得到重置 – 2012-07-10 12:13:37

回答

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"

+0

表的排序規則是utf8,插入到它的數據是utf8,取出的數據是utf8,它顯示的頁面同時具有utf -8頭和一個utf8 html元標記,仍然沒有運氣 – Ephemeralis 2012-07-10 13:25:14

+0

從頭開始,客戶端沒有正確提交utf8數據 – Ephemeralis 2012-07-10 14:11:20

+3

謝謝'$ pdo-> exec(「SET NAMES utf8」);'。它解決了我的問題 – 2013-02-27 19:54:50