MongoDB PHP UTF-8 проблемы - PullRequest
15 голосов
/ 07 мая 2011

Предположим, мне нужно вставить следующий документ:

{
    title: 'Péter'
}

(обратите внимание на é)

Выдает ошибку при использовании следующего PHP-кода ...:

$db->collection->insert(array("title" => "Péter"));

... потому что это должен быть utf-8.

Так что я должен использовать эту строку кода:

$db->collection->insert(array("title" => utf8_encode("Péter")));

Теперь, когда я запрашиваю документ, мне все равно нужно его декодировать ...:

$document = $db->collection->findOne(array("_id" => new MongoId("__someID__")));
$title = utf8_decode($document['title']);

Есть ли способ автоматизировать этот процесс? Могу ли я изменить кодировку символов MongoDB (я переношу базу данных MySQL, использующую cp1252 для Западной Европы (latin1)?

Я уже рассмотрел вопрос об изменении заголовка Content-Type, проблема в том, что все статические строки (жестко заданные) не являются utf8 ...

Заранее спасибо! Тим

Ответы [ 3 ]

18 голосов
/ 07 мая 2011

JSON и BSON могут кодировать / декодировать только допустимые строки UTF-8, если ваши данные (включая входные данные) не являются UTF-8, вам необходимо преобразовать их перед передачей в любую зависимую от JSON систему, например:

$string = iconv('UTF-8', 'UTF-8//IGNORE', $string); // or
$string = iconv('UTF-8', 'UTF-8//TRANSLIT', $string); // or even
$string = iconv('UTF-8', 'UTF-8//TRANSLIT//IGNORE', $string); // not sure how this behaves

Лично я предпочитаю первый вариант, см. Справочную страницу iconv(). Другие альтернативы включают в себя:

Вы должны всегда проверять, чтобы ваши строки были в кодировке UTF-8, даже если они были отправлены пользователем, однако, поскольку вы упомянули, что переходите с MySQL на MongoDB, вы пытались экспортировать свою текущую базу данных в CSV и использовать импорт скрипты которые идут с монго? Они должны справиться с этим ...


РЕДАКТИРОВАТЬ: Я упоминал, что BSON может обрабатывать только UTF-8, но я не уверен, что это действительно так, у меня есть смутное представление, что BSON использует UTF-16 или UTF-32 кодировать / декодировать данные, но я не могу проверить сейчас.

3 голосов
/ 10 декабря 2011

Как сказал @gates, все строковые данные в BSON кодируются как UTF-8 .MongoDB предполагает это.

Еще один ключевой момент, который не отвечает ни на один адрес: PHP не поддерживает Unicode .По крайней мере, с 5.3.PHP 6 предположительно будет поддерживать Unicode.Это означает, что вы должны знать, какую кодировку использует ваша операционная система по умолчанию и какую кодировку использует PHP.

Давайте вернемся к вашему первоначальному вопросу: «Есть ли способ автоматизировать этот процесс?»... я предлагаю убедиться, что вы всегда используете UTF-8 в своем приложении.Конфигурация, ввод, хранение данных, представление, все.Тогда «автоматизированная» часть заключается в том, что большая часть вашего PHP-кода будет проще, поскольку она всегда предполагает UTF-8.Нет необходимости в преобразованиях.Черт, никто не сказал, что автоматизация была дешевой.:)

Вот немного в стороне.Если вы создали небольшой PHP-скрипт для проверки этого insert() кода, выясните, какая кодировка у вашего файла, а затем конвертируйте в UTF-8 перед вставкой.Например, если вы знаете, что файл ISO-8859-1, попробуйте следующее:

$title = mb_convert_encoding("Péter", "UTF-8", "ISO-8859-1");
$db->collection->insert(array("title" => $title));

См. Также

2 голосов
/ 09 мая 2011

Могу ли я изменить кодировку символов MongoDB ...

В BSON данные не сохраняются.Согласно спецификации BSON все строки имеют формат UTF-8.

Теперь, когда я запрашиваю документ, мне все равно нужно его декодировать ...автоматизировать этот процесс?

Похоже, вы пытаетесь вывести данные на веб-страницу.Необходимость «декодировать» текст, который уже был закодирован, кажется неправильной.

Может ли эта проблема вывода быть проблемой конфигурации с Apache + PHP?UTF8 + PHP не является автоматическим, быстрый поиск в Интернете вывел несколько учебных пособий по этой теме.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...