2012-10-10 56 views
0

我使用的CakePHP與App.encoding設置爲UTF-8,<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />存在於我的<head>和我的MySQL數據庫設置爲UTF-8 Unicode編碼和utf8_general_ci整理。我在我的database.php連接細節中也有"encoding"=>"UTF8"爲什麼我必須utf8_decode()我的MySQL列值才能正確顯示?

當我在數據庫表中存儲'£'符號並使用命令行MySQL查看它時,字符顯示正確。

如果我使用CakePHP從數據庫表中獲取行並在我的網站中輸出它們,我會看到£而不是我想要的£符號。

但是,如果我然後使用utf8_decode()來輸出我的數據,它顯示正確。

這是正確的嗎?我曾嘗試使用htmlentities()將英鎊符號轉換爲&pound;,但它輸出&Acirc;&pound;而不是!即使當我使用字符集的附加參數。

也許有人可以幫忙 - 我一定錯過了這裏的東西,但我認爲角色應該正確顯示(如textarea HTML標籤),如果所有的標題,元標記等一致UTF-8?

+0

是什麼領域的數據庫編碼? – petervaz

+0

它顯示爲utf8_general_ci(utf8)當我運行'show full columns in t' – BeesonBison

+0

它可能是關閉正向斜槓在元標記的末尾,我以前遇到過問題。看看是否刪除它可以解決您的問題。 –

回答

0

您可以使用第三個參數ヶ輛安全編碼UTF-8:

htmlentities("£", ENT_COMPAT, "UTF-8") 
+0

我已經試過但它似乎沒有工作。例如,'htmlentities($ myVarFromMySQL,ENT_COMPAT,'UTF-8')'給我'Â £' – BeesonBison

+0

你需要在插入時使用它,而不是在讀取時(讀時可能已經太晚了) – blue112

+0

但是不會這意味着數據庫記錄將包含「£」而不是「£」? – BeesonBison

0

這聽起來像在數據庫中的數據是錯誤的:性格£實際存儲爲兩個字符£。

select charset(MyColumn), hex(MyColumn) from MyTable; 

如果列在UTF-8編碼,值「£」你應該看到輸出相同的::您可以通過進入數據庫,並使用十六進制和字符集的功能確認這

+---------------+-----------+ 
| utf8   | C2A3  | 
+---------------+-----------+ 

如果您看到其他內容,例如charset列報告latin1或十六進制列報告C382C2A3,表中的數據是錯誤的。它可以修復,但修復取決於數據所具有的錯誤類型。你從charsethex得到什麼?

+0

感謝您的深刻回覆!在我的桌子上運行這個查詢,就像你的例子一樣,我得到'utf8'和'C2A3'。 – BeesonBison

+0

然後,問題可能只是瀏覽器不顯示UTF-8頁面,儘管元標籤。元標記是中的第一件事嗎? Web服務器是否發送聲明不同編碼的Content-Type標頭? – Joni

+0

感謝Joni - meta標籤是''標籤下的第一件東西(除了空格)。如果我在Chrome中檢查響應頭,我可以看到沒有提及UTF-8。它只是說'內容類型:文本/ HTML'。這可能是問題嗎? – BeesonBison

0

如果一切UTF8刪除"encoding"=>"UTF8"在database.php中連接的詳細信息:

$conn = mysql_connect($server, $username, $password); 
//mysql_set_charset("UTF8", $conn); // REMOVED. ;) 
mysql_select_db($database, $conn); 
相關問題