2013-03-29 123 views
2

我的MySQL數據庫設置爲utf8_unicode_ci,並且當我從查詢中回顯文本時,$ pdo-> exec('SET NAMES「utf8」')作爲以下php代碼的一部分連字符 - 看起來很喜歡這個 - 「。我做錯了什麼,爲什麼連字符顯示不正確?utf8在回顯文本中沒有正確顯示連字符

<?php  
    try { 
     $pdo = new PDO('mysql:host=localhost;dbname=danville_tpf', 'danville_dan', 'password'); 
     $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
     $pdo->exec('SET NAMES "utf8"'); 
    } catch (PDOException $e) { 
     $output = 'Unable to connect to the database server.'; 
     include 'output.html.php'; 
     exit(); 
    } 

    $output = 'Theme Park Database initialized'; 
    //include 'output.html.php';// 

    try { 
     $park_id = $_GET['park_id']; 
     $query = "SELECT * FROM tpf_parks WHERE park_id = $park_id"; 
     $result = $pdo->query($query); 
    } catch (PDOException $e) { 
     $output = 'Unable to connect to the database server.'; 
     //include 'output.html.php';// 
    } 

    $output = 'Sucessfully pulled park'; 
    //include 'output.html.php';// 

    foreach ($result as $row) { 
     $parkdetails[] = array(
      'name' => $row['name'], 
      'blurb' => $row['blurb'], 
      'website' => $row['website'], 
      'address' => $row['address'], 
      'logo' => $row['logo'] 
     );  
    } 
?> 

請幫忙。

+0

您好!嘗試省略在你的php文件的第一行<?php之前創建的字符,我認爲這是來自你正在使用的服務器的編碼問題:) –

回答

8

â€「很常見mojibakeen dash),這是一個不同於連字符的字符。

這是採用破折號(0xe2 0x80 0x93)的UTF-8編碼形式並錯誤地假設它實際上使用Windows-1252編碼的結果。

解釋這三個字節的Windows-1252:0xe20x800x93分別獨立地表示â

假設冒犯字符在blurb字段中,如果您查詢SELECT HEX(blurb) FROM tpf_parks(帶有合適的WHERE子句),您將看到有問題的字節的十六進制編碼。

如果您在其中看到E28093,那麼數據庫值將正確編碼爲UTF-8,並且在客戶端或服務器配置中會出現字符編碼不匹配的情況。

然而,如果您看到C3A2E282ACE2809C,那麼該字符在數據庫中已經被錯誤地編碼 - 即被錯誤解釋,然後被保存爲這3個字符的UTF-8表示。如果是這種情況,則需要更新數據以解決問題。你可以做到這一點使用iconv

$fixedData = iconv("utf-8", "windows-1252", $badData); 

這將在雙轉換後的字節轉換回UTF-8編碼。

+0

非常感謝你的深入解釋。我是一名完整的初學者,在構建我的網站時使用了許多書籍,並使用PHP/MySQL。這個答案解釋了很多關於編碼如何工作以及如何識別問題的方法。原來我並沒有使用連字符,而是破折號。所以這是一個數據問題。謝謝。 – themeparkfocus

+1

啊,CP-1252的問題......我們不是都在那裏;-) –