假设我需要插入以下文档:
{
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西欧(latin1)的MySQL数据库吗?
我已经考虑过更改Content-Type-header,问题是所有静态字符串(硬编码)都不是utf8 ...
提前致谢! 添
答案 0 :(得分:18)
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编码/解码数据,但我现在无法检查。
答案 1 :(得分:3)
正如@gates所说,all string data in BSON is encoded as UTF-8。 MongoDB假设这一点。
另一个关键点,它既不回答地址: PHP不支持Unicode 。无论如何,截至5.3。据推测,PHP 6可以识别Unicode。这意味着您必须知道默认情况下操作系统使用的编码以及PHP正在使用的编码。
让我们回到你原来的问题:“有没有办法自动化这个过程?” ...我的建议是确保您在整个申请过程中始终使用UTF-8。配置,输入,数据存储,演示,一切。那么“自动化”部分就是大多数PHP代码都会更简单,因为它总是采用UTF-8。无需转换。哎呀,没有人说自动化很便宜。 :)
这是一种抛开。如果您创建了一个小PHP脚本来测试insert()
代码,请确定您的文件编码,然后在插入之前转换为UTF-8。例如,如果您知道该文件是ISO-8859-1,请尝试以下操作:
$title = mb_convert_encoding("Péter", "UTF-8", "ISO-8859-1");
$db->collection->insert(array("title" => $title));
答案 2 :(得分:2)
我可以更改MongoDB的字符编码......
BSON中没有存储数据。根据{{3}},所有字符串都是UTF-8。
现在,当我请求文档时,我仍然要解码它...: 有没有办法自动化这个过程?
听起来您正在尝试将数据输出到网页。需要“解码”已编码的文本似乎不正确。
这个输出问题可能是Apache + PHP的配置问题吗? UTF8 + PHP不是自动的,快速的在线搜索提出了关于这个主题的几个教程。