Mongo utf-8异常处理


Mongo utf-8 exception handling

我有一个问题插入数据到mongodb。

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

这给出了mongo异常"致命错误:未捕获的异常'MongoException'与消息'非utf8字符串:...."

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

有助于解决问题。但是,是否有一种方法可以强制php将所有传入数据设置为utf-8,这样我就不需要为每个数据使用mb_convert_encoding了?

I tried

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异常仍然发生。

如果数据来自浏览器,则浏览器将以与声明页面相同的编码发送数据。但是对于公共服务器来说,任意数据可以来自任何地方,因此在执行任何操作之前,您应该始终验证传入的数据都是格式良好的UTF-8。Codeigniter等框架就是这样做的。

要声明页面编码,可以使用Content-Type http报头:

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

注意,这只是声明编码,它本身不会将任何内容转换为UTF-8。为了确保您的PHP字符串字面值是UTF-8,您需要将PHP源文件保存为UTF-8编码。

不使用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中有bug:

mb_check_encoding($string,'UTF-8')错误返回的问题对于无效的UTF8字节序列,在两者之间的某个地方解析为truePHP 5.2.0和5.2.6