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. Затем вы можете читать их как байты и самостоятельно выполнять любые преобразования в Юникод.