0

最近、apache2を実行している専用のubuntuサーバーからnginxを実行している専用のdebian6サーバーにWebサイトを移行しました。

このウェブサイトはCakePHP2.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

utf8_encode()はISO-8859-1入力データのみを処理するため、他の文字セットを処理するためにiconvを調べる必要がある場合があります。ここでの課題は、受信データの文字セットを検出することかもしれません(FacebookのAPIからの応答でこれに直面したことがあります)が、この質問はいくつかの可能性を提供するはずです。

オフハンドで、使用しているMongoDBとPECLドライバーのバージョンは何ですか?私はPECLドライバーのMongoDB2.1と1.2.11devを使用しており、PHPで問題なくこれを行うことができました。

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

また、Mongoシェルを介してドキュメントを表示することもできました。

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

BSON仕様にはUTF-8が必要だと思いますが、この場合、Mongoは文句を言いませんでした。古いバージョンがこれについてもっと厳格であるかどうか私は興味があります。

于 2012-06-26T16:02:44.283 に答える
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 に答える