В моем PHP-коде я создаю экземпляр COM-объекта из внешней DLL. Он работает нормально, но у меня проблема с получением строки JSON от одного из методов объекта com.
Если строка не содержит нелатинских символов, то JSON, который я получаю, является правильным, но если есть хотя бы один нелатинский символ, требующий кодировки UTF-8, этот JSON при получении из COM-объекта не может быть проанализирован в PHP. json_last_error () показывает проблему с кодировкой UTF-8.
Я уверен, что COM-объект возвращает правильно закодированные строки, так как он используется в других средах и работает нормально.
Когда я проверяю содержимое полученной строки, очевидно, что нелатинские символы «кодируются» странным и недопустимым образом. Когда я проверяю ту же строку в COM-объекте, перед отправкой в PHP она корректно кодируется.
Похоже, что связь между объектами PHP и COM осуществляется с использованием кодировки, отличной от UTF-8, и это портит строку.
Единственное, что связано с использованием UTF-8 с COM-объектами, которые я обнаружил, это установка com.code_page = UTF-8 в секции [COM] php.ini. Однако независимо от того, как это установлено, у меня одинаково плохое поведение.
Что еще я должен сделать, чтобы получить правильную кодированную строку UTF-8 из COM-объекта?
Ну, ответ был прямо перед моими глазами, я просто упустил из виду:
Конструкция COM :: __ (строка $ module_name [, mixed $ server_name [, int $ codepage [, string $ typelib]]])
Есть параметр кодовой страницы. Если установлено в CP_UTF8, это работает.
$ server_name должно быть NULL, если сервер не используется.
Других решений пока нет …