PHP. Различная кодировка при вызове shell_exec из командной строки и браузера - PullRequest
0 голосов
/ 07 мая 2018

У меня есть PHP-скрипт:

<?php
  $cmd_desformat = "/usr/local/bin/process /tmp/input.txt > /tmp/output.txt";
  shell_exec($cmd_desformat);

Где input.txt - это файл UTF-8 (проверяется с помощью «file -i»), содержащий:

Buenos días

и / usr / local / bin / process - это исполняемый двоичный файл стороннего разработчика, который я широко использовал и никогда не сталкивался с этой проблемой.

Ну, проблема в том, что когда я выполняю это из браузера:

http://localhost/test.php

Результатом output.txt является файл US-ASCII, содержащий:

Buenos d?as [][

Однако, когда я выполняю это из командной строки:

php test.php

Результат output.txt - это файл UTF-8 с ожидаемым:

Buenos días [][

Я попытался выполнить из командной строки с пользователем www-data, чтобы посмотреть, смогу ли я повторить поведение браузера, но результат опять-таки правильный. Я также пытался использовать exec вместо shell_exec, но результаты те же. Также пробовал с Firefox и Chrome.

Мне нужно, чтобы он работал при вызове из браузера. Есть идеи?

1 Ответ

0 голосов
/ 07 мая 2018

Среда PHP CLI отличается от среды shell_exec. Есть две возможности, как сделать так, чтобы ваш контент возвращался надлежащим образом.

Самый простой способ - просто сбросить среду, вызвав env -i в вызове shell_exec.

<?php
  $cmd_desformat = "env -i /usr/local/bin/process /tmp/input.txt > /tmp/output.txt";
  shell_exec($cmd_desformat);

Это может не работать, если среда по умолчанию настроена неправильно. Если это так, то вам может потребоваться установить его явно, используя putenv().

<?php
  putenv('LANG=en_US.UTF-8'); // Set this to the language you need
  $cmd_desformat = "/usr/local/bin/process /tmp/input.txt > /tmp/output.txt";
  shell_exec($cmd_desformat);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...