Как получить строку UTF-8 с помощью COM-объекта в PHP?

В моем 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-объекта?


person Pedja YT9TP    schedule 06.11.2017    source источник


Ответы (1)


Что ж, ответ был прямо перед глазами, я просто проглядел:

COM::__construct (строка $module_name [, смешанная $server_name [, int $codepage [, строка $typelib]]])

Есть параметр кодовой страницы. Если установлено CP_UTF8, все работает.

$server_name должно быть NULL, если сервер не используется.

person Pedja YT9TP    schedule 06.11.2017
comment
А с COM строка, скорее всего, является BSTR, которая использует UTF-16. Но вы нашли, как перекодировать его в функции моста. - person Tom Blodget; 08.11.2017
comment
Док говорит, что по умолчанию используется ANSI, но, возможно, это была UTF-16, так как я заметил, что текстовый редактор может правильно отображать эту строку, поэтому он знает, как с ней обращаться. - person Pedja YT9TP; 09.11.2017