2013-03-22 90 views
1

我在將數據插入到mongodb時遇到了問題。Mongo utf-8異常處理

$name = $_REQUEST['name']; // "Iñtërnâtiônàlizætiøn"; 
$db->table->insert(
    array('name' => $name) 
); 

這讓蒙戈異常 「致命錯誤:未捕獲的異常 'MongoException' 有消息「非UTF8字符串:......」

$name = mb_convert_encoding($_REQUEST['name'], 'ISO-8859-1', 'UTF-8');

有助於解決這個問題。但是有沒有辦法強制php將所有傳入數據設置爲utf-8,因此我不需要爲每個數據使用mb_convert_encoding?

我試圖

mb_internal_encoding('UTF-8'); 
iconv_set_encoding('input_encoding', 'UTF-8'); 
iconv_set_encoding('internal_encoding', 'UTF-8'); 

沒有這些幫助的。

即使

mb_detect_encoding($_REQUEST['title']); 

給出了: 'UTF-8',但蒙戈異常仍occures。

+0

當心[爲'mb_convert_encoding'的參數的順序(HTTP ://php.net/manual/fr/function.mb-convert-encoding.php),您將*從* UTF-8 *轉換爲* ISO。 – 2014-07-11 12:21:56

回答

2

如果數據來自瀏覽器,瀏覽器將以與聲明頁面相同的編碼發送數據。但是對於公共服務器來說,任意數據都可以來自任何地方,因此在做任何事之前,您應該始終驗證傳入數據是否都是格式正確的UTF-8。像Codeigniter這樣的框架可以做到這一點。

要聲明頁面編碼,您可以使用Content-Type HTTP頭:

header("Content-Type: text/html; charset=UTF-8"); 

請注意,這只是聲明編碼,它本身並不東西轉換爲UTF-8。爲確保您的PHP字符串文字是UTF-8,您需要以UTF-8編碼保存您的PHP源文件。

不要使用mb_detect_encoding。要看到,如果事情是UTF-8:

if(!mb_check_encoding($str, "UTF-8")) 
{ 
    header("HTTP/1.1 400 Bad Request"); 
    die("Malformed UTF-8"); 
} 

然而,根據意見,mb_check_encoding在PHP 5.3 <竊聽:

The issue whereby mb_check_encoding($string,'UTF-8') falsely returns true for invalid UTF8 byte sequences was resolved somewhere between PHP 5.2.0 and 5.2.6