Проблемы MongoDB PHP UTF-8


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

{
    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 Западная Европа (латынь1)?

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

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

Author: elslooo, 2011-05-07

3 answers

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 и использовать сценарии импорта, поставляемые с Mongo? Они должны справиться с этим...


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

 15
Author: Alix Axel, 2017-01-03 14:01:39

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

Еще один ключевой момент, на который не отвечает ни один из ответов: PHP не поддерживает Юникод. По крайней мере, с 5.3. PHP 6 предположительно будет поддерживать Юникод. Это означает, что вы должны знать, какая кодировка используется вашей операционной системой по умолчанию и какую кодировку использует 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));

См. также

 3
Author: Adam Monsen, 2011-12-10 03:41:25

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

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

Теперь, когда я запрашиваю документ, мне все равно нужно его расшифровать... : Есть ли какой-нибудь способ автоматизировать этот процесс?

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

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

 2
Author: Gates VP, 2011-05-08 23:45:30