我在将数据插入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异常仍然存在。
答案 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