php - MongoDB PHP UTF-8 问题

标签 php mongodb utf-8

假设我需要插入以下文档:

{
    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()手册页。其他选择包括:

您应该始终确保您的字符串是 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/

相关文章:

javascript - 如何在单选按钮单击时获取 json 存储的数据

MongoDB $lookup 和 $map 对象数组

unicode - UTF-8编码为什么前缀10?

PHP 正在向 MySQL 插入问号

javascript - Facebook 群组中的 "Seen By"功能

php - 如何为产品做过滤器(laravel)

php - 全文搜索适用于 mysql 但不适用于 php

arrays - 如何在 MongoDB 中检索对象内的不同键

javascript - 使用 Mongoose 将一个模型引用到 Express 中的用户模型

grails - grails 2.5在 “UTF-8”页面中未显示 “show”字符,但在 “edit”中显示了正确的字符。 Grails使用了错误的字符集