CakePHP和MongoDB:非utf8字符串通知

时间:2012-06-26 14:30:59

标签: mongodb utf-8 nginx debian cakephp-2.0

我最近将一个网站从运行apache 2的专用ubuntu服务器迁移到运行nginx的专用debian 6服务器。

本网站使用CakePHP 2.0 + ichikaway's mongodb plugin(以及使用MongoDB)

由于我更改了服务器,当我尝试使用“français”或“èéï”等特殊字符保存“标签”子文档时,我发出了一个奇怪的通知。

它适用于其他控制器/模型/集合(例如,当我保存带有特殊字符的新注释时)。

我已经强制nginx使用utf-8,我的所有网站页面都有元字符集utf-8,所有.php(和.ctp)脚本都用utf-8编码。 我也试图强制utf8_encode()和utf8_encode(utf8_decode())(是的,这很糟糕......)字符串bug也出现了同样的错误。

以下是通知:(并注意文档未保存)

Notice (1024): non-utf8 string: fran��ais [APP/Plugin/Mongodb/Model/Datasource/MongodbSource.php, line 715]

上下文:

MongodbSource::update() - APP/Plugin/Mongodb/Model/Datasource/MongodbSource.php, line 715
Model::save() - CORE/Cake/Model/Model.php, line 1614
FiltersController::edit() - APP/Plugin/Administration/Controller/FiltersController.php, line 137
ReflectionMethod::invokeArgs() - [internal], line ??
Controller::invokeAction() - CORE/Cake/Controller/Controller.php, line 473
Dispatcher::_invoke() - CORE/Cake/Routing/Dispatcher.php, line 107
Dispatcher::dispatch() - CORE/Cake/Routing/Dispatcher.php, line 89
[main] - APP/webroot/index.php, line 96

我祈祷“Stack Overflow God”拯救我,我真的不知道在哪里可以让它像以前一样工作:(

感谢您的阅读。

3 个答案:

答案 0 :(得分:2)

好的,我终于找到了它!

我正在使用strtolower(),正是这个函数破坏了编码。

所以我用mb_strtolower()强制改变它utf-8并且它再次运行良好

答案 1 :(得分:0)

utf8_encode()仅处理ISO-8859-1输入数据,因此您可能需要查看iconv以处理其他字符集。这里的挑战可能是检测传入数据的字符集(我之前已经通过Facebook的API回复了),但是this question应该提供一些可能性。

副手,您使用的是哪个版本的MongoDB和PECL驱动程序?我使用的是PECL驱动程序的MongoDB 2.1和1.2.11dev,并且可以在PHP中执行此操作而不会出现问题:

$m = new Mongo();
$m->test->foo->insert(array('fran��ais' => 'français'));

我也可以通过Mongo shell查看文档:

> db.foo.find()
{ "_id" : ObjectId("4fe9d924e84df1844f000002"), "fran��ais" : "français" }

我意识到BSON规范需要UTF-8,但是在这种情况下Mongo没有抱怨。我很好奇旧版本对此更加严格。

答案 2 :(得分:0)

我解决了添加这些问题的问题:

for($i=0; $i<=count($values)-1; $i++){
            if(is_string($values[$i]))
                $values[$i] = utf8_encode($values[$i]);
        }

之后> ..Pluggin/Mongodb/Model/DataSource/MongodbSource.php
if (!$this->isConnected()) {
            return false;
        }

在更新和创建功能