2010-05-21 60 views
2

另一個UTF-8有關的問題,我相信UTF-8編碼...問題在PHP

我使用PHP來更新一個MySQL數據庫的數據,然後在其他地方的網站顯示的數據。以前我在瀏覽器中查看特殊字符顯示爲問號之前遇到過utf-8問題,但這個問題看起來有些不同。

我有許多記錄要輸入包含è字符。如果我直接在db中輸入,那麼它在頁面上顯示正確,所以我認爲utf-8內容正在正確輸出。

但是,當我嘗試更新數據庫中的值通過PHP,然後è字符被替換。反而出現的是& Atilde; & uml; (沒有空格)出現在瀏覽器中Ã

我有數據庫中的表設置爲使用UTF-8。我相信這是正確的COS,如前所述,如果我通過phpMyAdmin更新數據庫,那麼它一切正常。同樣,我已經爲頁面設置了字符編碼,這似乎是正確的。我也運行sql語句「SET NAMES'utf8';」在嘗試更新數據庫之前。

任何人有任何其他想法,問題可能在哪裏?

非常感謝

回答

3

是啊。

您擁有的字符是LATIN SMALL LETTER E WITH GRAVE。正如你所看到的,在UTF-8中,字符被編碼爲兩個字節0xC30xA8

但在許多默認,西方編碼(如ISO-8859-1),它們是單字節只,這個多字節字符被解碼成兩個單獨的字符,LATIN CAPITAL LETTER A WITH TILDEDIAERESIS。請注意它們在ISO-8859-1中是如何編碼爲C3A8

此外,它看起來像PHP通過htmlentities()處理這些字符,分別導致è

那麼,代碼中的問題究竟在哪裏?那麼,htmlentities()可能會自己做這一切,因爲它的第三個參數是一個編碼名稱 - 您可能沒有正確設置爲'UTF-8'。但它也可能是其他一些字符串處理函數。 (注:一般情況下,這是一個壞主意來存儲HTML實體在數據庫中 - 這一步應保留顯示的時間)

還有一堆的其他方式來絆倒自己了UTF- 8在PHP中 - 我建議點擊the cheatsheet,並確保你的狀態良好。

+0

是的。有點冗長的方式來說「擺脫htmlentities」。 – 2010-05-21 16:04:53

+0

我總是喜歡解釋編碼涉及到的情況。我能做的任何事情來提升理解力都是我書中的一個勝利。 – 2010-05-21 16:19:07

+0

爲此歡呼。非常感激 – Addsy 2010-05-21 19:43:02

0

我想你正在做某種形式提交的結果,並插入到數據庫的結果。如果是這樣,您必須確保您指示瀏覽器發送UTF-8數據,並且您應驗證用戶輸入的有效UTF-8數據流。

改變你的表單元素,包括接收字符集:與

<form accept-charset="utf-8" method="post" ... > 
    <input type="text name="field" /> 
    ... 
</form> 

驗證數據:

$valid = array_key_exists("field", $_POST) && !is_array($_POST['field']) && 
    preg_match('//u', $_POST['field']) && ...; //check length with mb_strlen etc. 
1

那麼它是你自己的代碼將字符轉換成實體。
作出正確選擇:

  1. 潘基htmlentities功能從腳本永遠。
  2. 使用htmlspecialchars,但不能插入,但whan顯示數據。
  3. 使用html_entity_decode修復數據庫中的現有數據。
0

我想你錯過了HTML頁面上的內容類型聲明:

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 

如果沒有它,瀏覽器會猜編碼,並轉換任何字符之外的編碼來發布表單時的實體。