我有一个问题插入数据到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