2013-07-09 111 views
2

閱讀用戶代理我最近曾與下列用戶代理一些遊客:如何正確使用特殊字符

Mozilla/5.0 (Linux; U; Android 2.3.6; es-co; XT320 Build/GRK39F) 
AppleWebKit/533.1 (KHTML, like Gecko) Versión/4.0 Mobile Safari/533.1 

我在一個MySQL表中插入這些列上是utf8_general_ci。我的PHP站點也作爲UTF-8。

Incorrect string value: '\xF3n/4.0...' for column 'useragent' at row 1 [1366] 

因此,它是導致問題的Ø: 不幸的是,我已經如下得到來自這些遊客一些錯誤。 爲了解決這個問題,我將firefox瀏覽器的useragent也改成了這個(使用UA切換器插件),但是這會完全插入到我的數據庫中。

所以,我的問題是:在某些情況下,它顯然不能工作?這怎麼解決? 我當然可以用o代替ó,但我認爲這不會是我將來遇到的最後一個特殊字符...

+1

你是如何將數據插入到數據庫之前?你能舉一個例子嗎? –

+0

我只是將查詢建立爲一個字符串,並將該值設置爲'mysqli_real_escape_string($ _ SERVER ['HTTP_USER_AGENT'])' –

回答

1

您的數據庫可能期望發送UTF-8編碼數據,但用戶代理以拉丁-1或其他特殊編碼難以解釋。這個應該不是,因爲HTTP標頭不應該使用非ASCII字符,因爲沒有機制來指定HTTP標頭的編碼方式,所以不可能知道正在處理什麼編碼。

您已經找到不符合要求的用戶代理。您應該檢查所有收到的字符串是否符合您的預期編碼;例如使用mb_check_encoding($str, 'UTF-8')。如果字符串不是預期的編碼,所有投注都關閉,您可以做任何您認爲正確的投注。放棄字符串,嘗試猜測其編碼並將其轉換,替換無效字節或其他任何你想要的東西。

0

難道這個字符串是用用戶重寫的代碼頁生成的。您可以嘗試

$Str = mb_convert_encoding (string , "auto", "UTF-8") 

其發送到DB

+0

如果它不是'mb_convert_encoding(字符串,「UTF-8」,「auto」)'然後? –

+0

因爲我沒有測試的手段,我只會嘗試它,並會讓你發佈...... –