假设我需要插入以下文档:
{
title: 'Péter'
}
(注意é)
当我使用以下 PHP 代码时,它给了我一个错误...:
$db->collection->insert(array("title" => "Péter"));
...因为它需要是 utf-8。
所以我应该使用这行代码:
$db->collection->insert(array("title" => utf8_encode("Péter")));
现在,当我请求文档时,我仍然需要对其进行解码...:
$document = $db->collection->findOne(array("_id" => new MongoId("__someID__")));
$title = utf8_decode($document['title']);
有没有办法自动化这个过程?我可以更改 MongoDB 的字符编码吗(我正在迁移使用 cp1252 West Europe (latin1) 的 MySQL 数据库?
我已经考虑过更改 Content-Type-header,问题是所有静态字符串(硬编码)都不是 utf8...
提前致谢! 蒂姆
最佳答案
JSON 和 BSON 只能对有效的 UTF-8 字符串进行编码/解码,如果您的数据(包含的输入)不是 UTF-8,则需要在将其传递给任何依赖 JSON 的系统之前对其进行转换,如下所示:
$string = iconv('UTF-8', 'UTF-8//IGNORE', $string); // or
$string = iconv('UTF-8', 'UTF-8//TRANSLIT', $string); // or even
$string = iconv('UTF-8', 'UTF-8//TRANSLIT//IGNORE', $string); // not sure how this behaves
我个人更喜欢第一个选项,请参阅 iconv()
手册页。其他选择包括:
-
mb_convert_encoding()
utf8_encode(utf8_decode($string))
您应该始终确保您的字符串是 UTF-8 编码的,即使是用户提交的,但是由于您提到您正在从 MySQL 迁移到 MongoDB,您是否尝试过将当前数据库导出到 CSV 并使用导入Mongo 自带的脚本?他们应该处理这个......
编辑:我提到 BSON 只能处理 UTF-8,但我不确定这是否完全正确,我有一个模糊的想法,即 BSON 使用 UTF-16 或 UTF-32编码/解码数据,但我现在无法检查。
关于php - MongoDB PHP UTF-8 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5920626/