Синхронизация PHP exec

Мне нужно адресовать имена файлов UTF-8 с помощью команды php exec. Проблема в том, что команда php exec, похоже, не понимает utf-8. Я использую что-то вроде этого:

echo exec('locale charmap');

возвращает ANSI_X3.4-1968

глядя на этот, вопрос будет таким:

echo exec('LANG=de_DE.utf8; locale charmap'); 

Но я все равно получаю тот же результат: ANSI_X3.4-1968

С другой стороны - если я запустил эту команду php в командной строке bash:

php -r "echo exec('LANG=de_DE.UTF8 locale charmap');"

Выход UTF-8. Итак, вопросы:

  • Почему существует другой результат: выполнить команду php в bash и на apache_module/веб-странице?
  • Как установить UTF-8 для exec, если он запущен внутри веб-сайта в качестве модуля apache?

Ответ 1

Чтобы ответить на мой собственный вопрос, я нашел следующее решение:

настройка переменной среды locale с помощью PHP

$locale='de_DE.UTF-8';
setlocale(LC_ALL,$locale);
putenv('LC_ALL='.$locale);
echo exec('locale charmap');

Это устанавливает/возвращает UTF-8. Поэтому я могу передавать специальные символы и умлауты командам linux shell.

Ответ 2

У меня была аналогичная проблема. Моя программа возвращала мне несколько немецких писем вроде: üäöß. Вот мой код:

$programResult = shell_exec('my script');

Переменная $programResult содержит немецкие умлауты, но они были сильно закодированы. Чтобы правильно закодировать его, вы можете вызвать функцию utf8_encode().

$programResult = shell_exec('my script');
$programResult = utf8_encode($programResult);