Передать строку Unicode в PHP shell_exec в Windows - PullRequest
3 голосов
/ 08 марта 2012

У меня есть программа для Windows, которая способна обрабатывать UTF16 на входе.В сценарии PHP у меня есть кодировка, объявленная как UTF8.Как вызвать shell_exec или аналогичные функции для запуска программы и передачи параметра без изменений?Или это вообще невозможно?

1 Ответ

2 голосов
/ 08 марта 2012

PHP реализует shell_exec, используя функцию стандартной библиотеки C popen. Это байтовая функция.

Среда выполнения Windows C интерпретирует байтовые данные для функций stdlib как представляющие текст, закодированный в текущей кодовой странице, по умолчанию специфичная для локали кодовая страница, которая никогда не будет UTF, поэтому, к сожалению, вы не можете надежно получить Unicode по этому пути .

Вы можете попробовать , запустив приложение с кодовой страницей, измененной на 65001, кодовая страница Windows, которая должна быть UTF-8. Однако есть ряд ошибок stdlib, из-за которых работа в кодовой странице 65001 ненадежна, поэтому есть вероятность, что она не будет работать. И если вы работаете на веб-сервере, возиться с глобальными настройками процесса - рискованно.

Это проблема со всеми инструментами, которые используют функции C stdlib, которые являются почти всеми языками сценариев. Единственный надежный способ взаимодействия с Unicode в args или envvars, когда вы обнаруживаете, что работаете под Windows, - это использовать вместо этого встроенные функции Win32 API. В PHP похоже, что вы могли бы сделать это, используя w32api_invoke_function для вызова CreateProcessW. (Сам не сделал, но та же стратегия работает с Python, используя ctypes.)

Либо передайте данные через потоки stdin / stdout. Затем вы можете читать их как байты и самостоятельно выполнять любые преобразования в Юникод.

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