【问题标题】:PHP exec change encodingPHP exec更改编码
【发布时间】:2012-12-07 08:45:45
【问题描述】:

我需要使用 php exec 命令来处理 UTF-8 文件名。问题是 php exec 命令似乎不理解 utf-8。我使用这样的东西:

echo exec('locale charmap');

返回ANSI_X3.4-1968

查看this SO 问题,解决方案如下:

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

但我仍然得到相同的输出:ANSI_X3.4-1968

另一方面 - 如果我在 bash 命令行上执行这个 php 命令:

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

输出为 UTF-8。 所以问题是:

  1. 为什么在 bash 和 apache_module/web 页面执行 php 命令会有不同的结果?
  2. 如果exec 在网站内作为 apache 模块运行,如何设置 UTF-8?

【问题讨论】:

  • 等一下,您是要更改由exec 生成的进程的语言环境,还是要让exec 更改PHP 的 语言环境?
  • @Charles 我不确定,你到底是什么意思。但我发现了以下解决方案(请看下面)。
  • 你是怎么知道你的 exec 命令返回的 ANSI_X3.4-1968

标签: php encoding utf-8 exec


【解决方案1】:

回答我自己的问题 - 我找到了以下解决方案:

使用 PHP 设置语言环境变量

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

这设置为/返回UTF-8。所以我可以将特殊字符和变音符号传递给 linux shell 命令。

【讨论】:

  • 发现这个让我现在成为一个快乐的人。感谢您的问答
  • 这很棒。我会在 /etc 的配置文件中设置字符集,但是在服务器从 Ubuntu 12.04 升级到 14.04 之后,该配置显然已经消失了。所以最好在PHP文件中设置,以免以后出现问题。
  • 请注意,您还可以在 exec 调用之前指定 LC_ALL=... (就像在原始帖子中使用错误的环境变量一样),以便在需要时仅影响一个调用,例如exec('LC_ALL=de_DE.UTF-8 locale charmap') - 有时,这可能看起来更干净。
  • 谢谢。这对我帮助很大。我不明白一种应该是“现代”并且几乎​​是世界上使用最广泛的语言的语言怎么可能默认为 1968 年设计的字符集!
  • putenv('LC_ALL=cs_CZ.utf-8') 为我解决了问题。突然我的捷克字符命令没有损坏
【解决方案2】:

这为我解决了(来源:this comment here):

<?php
putenv('LANG=en_US.UTF-8'); 
$command = escapeshellcmd('python3 myscript.py');
$output = shell_exec($command);
echo $output;
?>

【讨论】:

  • 完全解决了我的问题。为文档点赞!
  • 我用 R 语言得到了invalid input found on input connection source() 由 php 调用。 php-> shell ->R.你救了我:)
【解决方案3】:

我遇到了类似的问题。我的程序返回给我一些德语字母,例如:üäöß。这是我的代码:

$programResult = shell_exec('my script');

变量$programResult 包含德语变音符号,但它们编码错误。为了正确编码,您可以调用utf8_encode() 函数。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-20
    • 2015-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多