2012-06-26 2 views
0

Недавно я перенес сайт с выделенного сервера ubuntu, на котором запущен apache 2, на выделенный сервер debian 6 с nginx.CakePHP and MongoDB: not-utf8 string notice

Этот сайт использует CakePHP 2,0 + ichikaway's mongodb plugin (и поэтому использование MongoDB)

Так как я изменить свой сервер, у меня есть странное уведомление, когда я пытаюсь спасти «метку» поддокументы со специальными символами, как «французский» или "ééï".

Он работает в других контроллерах/моделях/коллекциях (например, когда я сохраняю новый комментарий со специальными символами для примера).

Я уже заставляю 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 

Молю "Stack Overflow Бог" чтобы спасти меня, я действительно не знаю, где искать больше, чтобы заставить его работать, как раньше :(

Th anks вы для чтения.

ответ

1

Хорошо, я наконец нашел его!

Я использовал strtolower(), и именно эта функция нарушала кодировку.

Так что я изменить его с mb_strtolower() принуждая UTF-8, и она работает хорошо снова

0

utf8_encode() только обрабатывает входные данные ISO-8859-1, поэтому вам может потребоваться изучить iconv для обработки других наборов символов. Задача здесь может заключаться в обнаружении набора символов входящих данных (я столкнулся с этим раньше с ответами API Facebook), но this question должен предложить несколько возможностей.

Вне зависимости от того, какую версию MongoDB и драйвер PECL вы используете? Я на MongoDB 2.1 и 1.2.11dev водителя PECL и был в состоянии сделать это в PHP без проблем:

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

Я также был в состоянии просмотреть документ с помощью оболочки Монго:

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

Я понимаю, что спецификация BSON требует UTF-8, но Mongo не жаловался в этом случае. Мне любопытно, если более старые версии более строго об этом.

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; 
     } 

в обновлении и создавать функции