CakePHP和MongoDB:非utf8字符串通知

CakePHP和MongoDB:非utf8字符串通知,mongodb,utf-8,nginx,debian,cakephp-2.0,Mongodb,Utf 8,Nginx,Debian,Cakephp 2.0,我最近将一个网站从运行Apache2的专用ubuntu服务器迁移到运行nginx的专用Debian6服务器 该网站使用CakePHP 2.0+(因此使用MongoDB) 由于我更改了服务器,所以当我试图保存带有特殊字符(如“français”或“èè”)的“tags”子文档时,会有一个奇怪的提示 它适用于其他控制器/模型/集合(例如,当我使用特殊字符保存新注释时) 我已经强制nginx使用utf-8,我所有的网站页面都有meta字符集utf-8,所有的.php(和.ctp)脚本都用utf-8编码

我最近将一个网站从运行Apache2的专用ubuntu服务器迁移到运行nginx的专用Debian6服务器

该网站使用CakePHP 2.0+(因此使用MongoDB)

由于我更改了服务器,所以当我试图保存带有特殊字符(如“français”或“èè”)的“tags”子文档时,会有一个奇怪的提示

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

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

注意事项如下:(注意文档未保存)

和上下文:

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
我祈祷“堆叠溢出的上帝”来拯救我,我真的不知道该去哪里寻找,让它像以前一样工作:(

感谢阅读。

只处理ISO-8859-1输入数据,因此您可能需要研究处理其他字符集的方法。这里的一个挑战可能是检测传入数据的字符集(我以前在Facebook API的响应中遇到过这个问题),但应该提供一些可能性

现在,您使用的是哪个版本的MongoDB和PECL驱动程序?我使用的是MongoDB 2.1和1.2.11dev的PECL驱动程序,并且能够在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在这件事上没有抱怨。我很好奇旧版本是否对此更严格。

好的,我终于找到了

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


因此,我使用mb_strtolower()强制utf-8对其进行更改,它再次正常工作

我解决了添加以下行的问题:

for($i=0; $i<=count($values)-1; $i++){
            if(is_string($values[$i]))
                $values[$i] = utf8_encode($values[$i]);
        }
在更新和创建函数中

for($i=0; $i<=count($values)-1; $i++){
            if(is_string($values[$i]))
                $values[$i] = utf8_encode($values[$i]);
        }
if (!$this->isConnected()) {
            return false;
        }