2012-03-07 2 views
2

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

ответ

2

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

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

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

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

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

Смежные вопросы