0

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

这个网站使用的是 CakePHP 2.0 + ichikaway 的 mongodb 插件(所以使用 MongoDB)

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

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

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

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

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

我祈祷“堆栈溢出之神”来拯救我,我真的不知道该去哪里让它像以前一样工作了:(

谢谢你的阅读。

4

3 回答 3

2

好的,我终于找到了!

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

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

于 2012-06-27T15:07:00.907 回答
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;
        }

在更新和创建函数中

于 2013-05-06T22:36:13.850 回答
0

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

副手,您使用的是什么版本的 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 在这种情况下没有抱怨。我很好奇旧版本是否对此更严格。

于 2012-06-26T16:02:44.283 回答