PHP。从命令行和浏览器调用shell_exec时的不同编码

PHP。从命令行和浏览器调用shell_exec时的不同编码,php,browser,encoding,utf-8,Php,Browser,Encoding,Utf 8,我有一个php脚本: <?php $cmd_desformat = "/usr/local/bin/process /tmp/input.txt > /tmp/output.txt"; shell_exec($cmd_desformat); 和/usr/local/bin/process是来自第三方的二进制可执行文件,我已经广泛使用了它,但从未遇到过这个问题 问题是,当我从浏览器执行此操作时: http://localhost/test.php result output

我有一个php脚本:

<?php
  $cmd_desformat = "/usr/local/bin/process /tmp/input.txt > /tmp/output.txt";
  shell_exec($cmd_desformat);
和/usr/local/bin/process是来自第三方的二进制可执行文件,我已经广泛使用了它,但从未遇到过这个问题

问题是,当我从浏览器执行此操作时:

http://localhost/test.php
result output.txt是一个US-ASCII文件,包含:

Buenos días
Buenos d?as [][
但是,当我从命令行执行此命令时:

php test.php
result output.txt是一个UTF-8文件,具有预期的:

Buenos días [][
我曾尝试使用user
www-data
从命令行执行,以查看是否可以复制浏览器行为,但结果还是正确的。我还尝试使用
exec
而不是
shell\u exec
,但结果是一样的。还尝试了Firefox和Chrome


我需要它在从浏览器调用时工作。有什么想法吗?

PHP CLI环境与
shell\u exec
环境不同。有两种方法可以让您的内容以正确的方式返回

最简单的方法是通过调用
shell\u exec
调用中的
env-i
来重置环境

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

bin/process
是否对环境区域设置敏感…?
<?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);