2012-01-22 61 views
2

我有一個PHP網站,上面有CLEditor richtext control。當我嘗試在數據庫中寫入歐元和英鎊時,字符經歷的很好,因爲我在包含頁面HTML,richtext控件IFRAME HTML和MySQL表格整理中將字符集設置爲UTF-8。在這方面一切都很好。然而,當我嘗試寫smart quotes,我最終看到這個產量在數據庫:使用PHP和MySQL,我該如何正確地將智能報價寫入數據庫?

This is a “testâ€. 

(如果還是無法正確顯示在上面,你的瀏覽器,測試字有像拉丁一個,歐元符號和單詞前面的小AE符號以及後面的拉丁文a和歐元符號)。

當我使用PHP將該值從數據庫中讀出並顯示在頁面上時,它最終成爲帶有問號的黑色鑽石以及其他一些拉丁字符。

我應該怎麼做才能解決這個問題?

回答

3

首先,確保你的MySQL表使用UTF-8作爲其編碼。如果是,它看起來就像這樣:

mysql> SHOW CREATE TABLE Users (
... 
) ENGINE=InnoDB AUTO_INCREMENT=30 DEFAULT CHARSET=utf8 | 

接下來,確保你的HTML頁面設置爲顯示UTF-8:

<html> 
    <head> 
     <meta http-equiv="content-type" content="text/html;charset=UTF-8" /> 
    </head> 
    .... 
</html> 

那麼它應該工作。


編輯:我故意沒有談整理,因爲我認爲它已經被考慮,但每個人的利益,讓我多些添加到這個答案。

幽州,

我有字符集設置爲UTF-8 ...在MySQL表中的排序規則。

表格歸類與charset不是一回事。

整理是自動嘗試將一個字符集轉換爲另一個字符集的行爲用於查詢的目的。例如,如果你有一個latin1字符集和一個UTF-8排序規則,並且你做了一些類似於SELECT * FROM foo的WHERE bar LIKE'% - %'; (UTF-8 U + 2014)放在一張latin1字符集的表格上,該字符集匹配L + 0151 U + 2014。

並非如此巧合......如果你是輸出這個LATIN1編碼的字符到UTF-8編碼的網頁,你會得到如下:

這是一個“testâ€。

這似乎是你的問題的輸出,確切地說。下面是HTML複製它:

<?php 
$string = "This is a 「test」."; 
?> 
<html> 
    <head> 
     <meta http-equiv="Content-Type" content="text/html;charset=utf8"/> 
    </head> 
    <body> 
     <p><?php echo $string; ?></p> 
    </body> 
</html> 

請確保您保存此文件在latin1中...

要看看你的字符集表被設置爲,運行此查詢:

SELECT CCSA.character_set_name, TABLE_COLLATION FROM information_schema.`TABLES` T, 
     information_schema.`COLLATION_CHARACTER_SET_APPLICABILITY` CCSA 
WHERE CCSA.collation_name = T.table_collation 
    AND T.table_schema = "database" 
    AND T.table_name = "table"; 

只有正確的結果,爲您的使用(除非你使用多個非英語語言會)是:

+--------------------+-----------------+ 
| character_set_name | TABLE_COLLATION | 
+--------------------+-----------------+ 
| utf8    | utf8_general_ci | 
+--------------------+-----------------+ 

感謝upvotes ;-)

+0

不要吝嗇,因爲我非常感謝您的高度聰明的迴應,西奧多 - 您在過去一些PHP OOP問題上幫助我解決了問題。然而,爲了迴應 - 在那裏,做到了。我已經在我的帖子中提到過。請注意,大多數其他UTF-8的東西已經工作。這只是表現時髦的巧妙語錄。 – Volomike

+0

我真的沒有看到你說過你試過以上的地方。我已經重讀了它,仍然無法看到你提到的這個地方; /我向你展示了什麼是常見的問題。第三步是檢查你的輸入字符。但我想你已經想到了那個。猜猜我錯了。 –

+0

「當我嘗試將歐元和英鎊寫入數據庫時​​,角色經歷的很好,因爲我在包含頁面HTML,richtext控件IFRAME HTML和MySQL表格整理中將字符集設置爲UTF-8在這方面一切都很好。「 – Volomike

-1

我找到了答案在這裏:

https://stackoverflow.com/a/1262210/105539

這似乎不打擾我的歐元和英鎊的人物。

+0

我懷疑這是對您的問題非常安全的答案。如果用戶粘貼了©或甚至 - 或...您的應用會顯示各種破損的字符,會發生什麼情況。最好讓你的輸入和輸出權利,而不是依靠PHP字符串函數。 –

+0

我只是試過這些角色。他們在我提出的系統中工作得很好。我的HTML爲UTF-8,數據庫表爲UTF-8,而我對數據做的唯一事情就是使用上面的示例鏈接進行stripslashes,trim,並運行MS字符的strstr。 – Volomike

0

確保您的PHP文件在打印任何內容之前在頂部有這個文件。我可以將latin_swedish_ci轉換爲utf8編碼的網站,並且編碼正確。

header("Content-type: text/html;charset=UTF-8");

我也把這個我的數據庫連接後(不知道這一樣重要):

mysql_query("SET NAMES 'utf8'");
mysql_query("SET CHARACTER SET 'utf8'");

0

對於什麼是值得別人來翻過這篇文章,我發現添加這些mysqld配置行 - 如果您有權訪問mysql服務器並且可以進行更改 - 用捲曲引號解決了我的問題。

http://dev.mysql.com/doc/refman/5.6/en/charset-server.html

# Force UTF8 Charset Encoding 
skip-character-set-client-handshake 
collation_server=utf8_unicode_ci 
character_set_server=utf8 

我雙重檢查從PHP被稱爲SQL(出現罰款),並手動從我的GUI彎引號(這工作得很好)執行的插入/更新statment,但是來自Web服務器的仍然是將多控制字符插入到數據庫中。

我檢查了我的mysql服務器變量,發現latin1是服務器和數據庫(即使表/列是UTF8)的默認值。一旦我添加上面的行並刷新發布更新語句的頁面,捲曲引號就會正確插入。我只能假設這與我們的服務器的默認字符集latin1和Web服務器mysql庫握手協商等有關。

相關問題