我遇到了一個問題,我認爲它與unicode文本有關。當用戶輸入具有unicode項目符號字符的字符串時,mysql無法保存該字段(儘管可以使用其他更新查詢)。以下是我一直試圖解決它的方式。刪除Unicode符號
$str = "· Close up the server";
$str = preg_replace("\u2022", "•", $str);
......然而,這仍然沒有工作。
我遇到了一個問題,我認爲它與unicode文本有關。當用戶輸入具有unicode項目符號字符的字符串時,mysql無法保存該字段(儘管可以使用其他更新查詢)。以下是我一直試圖解決它的方式。刪除Unicode符號
$str = "· Close up the server";
$str = preg_replace("\u2022", "•", $str);
......然而,這仍然沒有工作。
這裏有很多事情可能會出錯,因爲數據庫,表單提交和源代碼字符串文字都涉及。我假設你想要使用UTF-8,因爲在使用json_
或接受超過200個不同的字符時,使用其他任何典型編碼(CP1252,Latin1)將會導致錯誤。
首先要做的是刪除任何類型的轉換等代碼,旨在試圖解決編碼問題。如utf8_encode
,htmlentitites
,*_replace
..不管。
源編碼。
$str = "· Close up the server";
在編寫上述內容時,需要使用UTF-8對PHP源文件進行物理編碼。如果你在Windows上,你必須明確地做或配置它。在Windows上,UTF-8不會發生奇蹟般的現象。
表單提交
當用戶提交表單,有效載荷將在任何編碼,你聲明的頁面是。你可以像這樣把它聲明:
header("Content-Type: text/html; charset=utf-8");
但任何人都可以提交實際上任意字節到你的服務器,所以你應該驗證輸入是UTF-8繼續之前。 mb_check_encoding
是不錯的。
數據庫
因爲在這一點上你的數據在未來爲UTF-8,您輸入的字符串是UTF-8。您必須在連接到數據庫後通過指定連接編碼來指定。
mysql_set_charset("utf8"); //After making the connection, and before any queries
//or $mysqli->set_charset("utf8");
這使得數據庫以UTF-8讀取輸入,並以UTF-8編碼輸出。你也想把你的列/表/數據庫設置爲UTF-8。
Unicode轉義序列\uxxxx
或或\Uxxxxxxxx
在PHP不受支持。
\u2022
是UTF-16
十六進制編碼爲「子彈」。不是UTF-8
。
您可能還想要SET NAMES 'UTF-8';
或在打開數據庫之前更改字符集。
@ficuscr我不認爲缺乏理解值得讚揚。如果OP不缺乏理解力,他就不會首先提出問題。當有人有問題時,通常是因爲他們「缺乏瞭解」。按照這個邏輯,我們應該減少每個問題的答案,因爲他們要求答案,這表明「缺乏瞭解」。 –
@ SkeetsO'Reilly完全不記得這一點。不知道我是否指另一個答案?謝謝。 – ficuscr
你試過'$ str = preg_replace(「·」,「•」,$ str);'? – Vladimir
你試過'$ str = htmlentities($ str)'嗎? – GolezTrol
@Vladimir有一個點 – samayo