Mongo utf-8异常处理

时间:2013-03-22 15:39:33

标签: php mongodb encoding utf-8

我在将数据插入mongodb时遇到问题。

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

这给出了mongo异常“致命错误:未捕获异常'MongoException',消息'non-utf8 string:....”

$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'但mongo异常仍然存在。

1 个答案:

答案 0 :(得分: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:

中被窃听
  

mb_check_encoding($ string,'UTF-8')错误返回的问题   对于无效的UTF8字节序列,true在某处解析   PHP 5.2.0和5.2.6