[英]Problems with utf-8 encoding in php
我相信另一個與utf-8相關的問題...
我正在使用php更新mysql db中的數據,然后在站點的其他位置顯示該數據。 以前,我在遇到UTF-8問題之前,在瀏覽器中使用特殊字符顯示為問號之前,這似乎有點不同。
我要輸入許多包含è字符的記錄。 如果我直接在數據庫中輸入此內容,則它會正確顯示在頁面上,因此我認為這表示utf-8內容正在正確輸出。
但是,當我嘗試通過php更新db中的值時,替換了è字符。 出現的是Ã ¨ (無空格)在瀏覽器中顯示為è
我將數據庫中的表設置為使用UTF-8。 我相信這是正確的cos,如上所述,如果我通過phpMyAdmin更新數據庫,一切正常。 同樣,我為似乎正確的頁面設置了字符編碼。 我也在運行sql語句“ SET NAMES'utf8';” 在嘗試更新數據庫之前。
有人對問題可能出在哪里有其他想法?
非常感謝
對。
您所擁有的字符是帶有墓碑的拉丁文小寫字母E。 如您所見,在UTF-8中,該字符被編碼為兩個字節0xC3
和0xA8
。
但是在許多默認的西方編碼(例如ISO-8859-1)中,這些編碼僅是單字節的,此多字節字符被解碼為兩個單獨的字符,即帶大寫 字母的拉丁文大寫字母 A和DIAERESIS 。 請注意,它們在ISO-8859-1中是如何同時編碼為C3和A8的 ?
此外,似乎PHP正在通過htmlentities()處理這些字符,從而導致Ã
和¨
分別。
那么,代碼中的問題到底在哪里? 嗯, htmlentities()
可以自己完成所有操作,因為它的第3個參數是編碼名稱-您可能沒有正確設置為'UTF-8'
。 但這也可能是其他字符串處理函數。 (注意:通常,將HTML實體存儲在數據庫中是個壞主意-此步驟應保留用於顯示時間)
還有很多其他方法可以使您在php中使用UTF-8絆倒-我建議您填寫備忘單 ,並確保您的身體狀況良好。
好吧,這是您自己的代碼將字符轉換為實體。
要正確處理:
htmlentities
功能。 htmlspecialchars
,但不要在插入時使用,而要顯示數據。 html_entity_decode
修復數據庫中的現有數據。 我想您正在獲取某種表單提交的結果,並將結果插入數據庫中。 如果是這樣,則必須確保指示瀏覽器發送UTF-8數據,並且應驗證用戶輸入的有效UTF-8流。
更改表單元素以包括accept-charset:
<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.
我認為您錯過了html頁面上的Content-Type聲明:
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
如果沒有,瀏覽器將猜測編碼,並在發布表單時將編碼之外的任何字符轉換為實體。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.