Intereting Posts
Очистка и проверка формы php Doctrine2 экспортирует объект в массив Вымысел конкретного метода в абстрактном классе с использованием phpunit Поля MySQL datetime и летнее время – как я могу ссылаться на «дополнительный» час? Знание с помощью PHP, если браузер может воспроизводить аудиофайл с помощью тега html5 audio bcdiv с очень маленьким поплавком с научной нотацией вызывает ошибку «Деление на ноль» Как сохранить XML с помощью PHP C # эквивалентно ассоциативному массиву php Максимальный размер сеанса PHP Как удалить переменную из массива сеансов PHP CakePHP Media Plugin Issue – неопределенный метод MIME_Type :: config () Лучшая практика для повторного набора результатов в Postgres / PHP / PDO? PHP – слияние дубликатов ключей массива в многомерном массиве Вызовите метод в приложении Console, которое выполняется в настоящий момент. веб-страница викторины проверила все ответы

Проблемы с 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 West Europe (latin1)?

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

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

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() страницу iconv() . Другие альтернативы включают:

  • mb_convert_encoding()
  • utf8_encode(utf8_decode($string))

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


EDIT: Я упоминал, что BSON может обрабатывать только UTF-8, но я не уверен, что это точно так, я имею смутное представление о том, что BSON использует UTF-16 или UTF-32 для кодирования / декодирования данных, но я могу " t проверить сейчас.

Как сказал @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)); 

Смотрите также

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

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

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

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

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