簡體   English   中英

PHP中UTF-8編碼的問題

[英]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中,該字符被編碼為兩個字節0xC30xA8

但是在許多默認的西方編碼(例如ISO-8859-1)中,這些編碼僅是單字節的,此多字節字符被解碼為兩個單獨的字符,即帶大寫 字母的拉丁文大寫字母 ADIAERESIS 請注意,它們在ISO-8859-1中是如何同時編碼為C3A8的

此外,似乎PHP正在通過htmlentities()處理這些字符,從而導致Ã ¨ 分別。

那么,代碼中的問題到底在哪里? 嗯, htmlentities()可以自己完成所有操作,因為它的第3個參數是編碼名稱-您可能沒有正確設置為'UTF-8' 但這也可能是其他字符串處理函數。 (注意:通常,將HTML實體存儲在數據庫中是個壞主意-此步驟應保留用於顯示時間)

還有很多其他方法可以使您在php中使用UTF-8絆倒-我建議您填寫備忘單 ,並確保您的身體狀況良好。

好吧,這是您自己的代碼將字符轉換為實體。
要正確處理:

  1. 永遠禁止腳本中的htmlentities功能。
  2. 使用htmlspecialchars ,但不要在插入時使用,而要顯示數據。
  3. 使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM