2012-12-20 127 views
1

我遇到了一個問題,我認爲它與unicode文本有關。當用戶輸入具有unicode項目符號字符的字符串時,mysql無法保存該字段(儘管可以使用其他更新查詢)。以下是我一直試圖解決它的方式。刪除Unicode符號

$str = "· Close up the server";

$str = preg_replace("\u2022", "•", $str); 

......然而,這仍然沒有工作。

+0

你試過'$ str = preg_replace(「·」,「•」,$ str);'? – Vladimir

+0

你試過'$ str = htmlentities($ str)'嗎? – GolezTrol

+0

@Vladimir有一個點 – samayo

回答

4

這裏有很多事情可能會出錯,因爲數據庫,表單提交和源代碼字符串文字都涉及。我假設你想要使用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不受支持。

2

\u2022UTF-16十六進制編碼爲「子彈」。不是UTF-8

您可能還想要SET NAMES 'UTF-8';或在打開數據庫之前更改字符集。

+0

@ficuscr我不認爲缺乏理解值得讚揚。如果OP不缺乏理解力,他就不會首先提出問題。當有人有問題時,通常是因爲他們「缺乏瞭解」。按照這個邏輯,我們應該減少每個問題的答案,因爲他們要求答案,這表明「缺乏瞭解」。 –

+0

@ SkeetsO'Reilly完全不記得這一點。不知道我是否指另一個答案?謝謝。 – ficuscr