2010-11-23 32 views
0

乾草,我已經做了一個簡單的應用程序,用戶將內容上傳到MySQL數據庫,但是一些實體沒有被編碼。這樣的事情出現在字段中存儲âÂÂ的MySQL

ââ¬Å 

而不是引號和什麼不是。我知道應該在將這些值插入數據庫時​​將這些值編碼爲HTML實體,但現在有幾千行包含數據。

當數據返回給瀏覽器時,我們是否有PHP函數來編碼這些值?


亞歷克斯·布朗更新。由於編碼可以在這裏是一個問題,也是如此,這是我看到:

alt text

+1

你在數據庫中使用了什麼字符編碼,用於連接和輸出? – Gumbo 2010-11-23 10:25:04

回答

4

用戶的瀏覽器所提交的數據是UTF-8編碼,但你要連接到其1)假定你數據庫正在提交latin1編碼的數據2)將您的數據存儲爲latin1編碼的字符串。您的數據因此被存儲爲錯誤編碼。

當您從數據庫檢索數據時,它將作爲latin1字符串提供,但由於latin1字符串是錯誤編碼的UTF-8,並且PHP天真地將所有字符串視爲二進制字符串,所以您只需將原始的UTF- 8串又回來了。當您將此字符串回送到再次聲明爲UTF-8編碼的HTML頁面時,該字符串將顯示爲由用戶提交的字符串。

但是,如果您使用對MySQL對字符集的處理有深入理解的軟件查看數據庫的內容,該軟件會將列字符集標識爲latin1,並確保它顯示的字符的確是字符latin1字符串,正如我們所指出的那樣,它是錯誤編碼的UTF-8。您因此看到錯誤編碼的數據。

您應採取多種措施來解決此問題。首先,你期望處理UTF-8編碼的數據(在HTML級別聲明),所以你應該確保你也是這樣與MySQL進行通信的。每當您與數據庫建立連接時,您都需要簽發SET NAMES 'utf8'。 (注意:您的數據庫API可能會提供更改連接字符集的特殊功能,我認爲mysql API沒有,但我不確定。)

其次,您應該確保您存儲了數據UTF-8編碼。這意味着你的數據庫列的字符集應該是utf8。可以使用ALTER TABLE ... MODIFY語句更改列字符集。不要忘記也要更改表默認字符集(這會將新列的字符集添加到未明確指定字符集的表中)。並在您處於此狀態時更改數據庫字符集。

但是,當您更改列字符集時,MySQL會假定已存儲在該表的行中的數據不會被錯誤編碼,而是存儲在舊字符集中的有效數據。因此,它會將你錯誤編碼的UTF-8數據(將其視爲latin1編碼數據)轉換爲UTF-8編碼數據,以便最終獲得雙UTF-8編碼的數據。有一個技巧可以解決這個問題:首先將列字符集轉換爲binary字符集,然後從binary轉換爲utf8。這樣,MySQL不會更改數據的二進制形式,因爲您正在通過將其視爲任意二進制字符串的格式進行轉換。

祝你好運!

相關問題