1

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

4

1 回答 1

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 中存在错误:

在 PHP 5.2.0 和 5.2.6 之间解决了 mb_check_encoding($string,'UTF-8') 错误地为无效 UTF8 字节序列返回 true 的问题

于 2013-03-23T13:55:33.633 回答