You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP执行Shell命令返回ASCII而非UTF-8,中文文件名乱码求助

PHP调用aws s3 ls命令中文乱码(显示??)的解决方法

核心解决方法

1. 执行命令时强制指定UTF-8 locale

在调用aws命令前,明确设置LC_ALL和LANG环境变量为UTF-8,确保子进程以UTF-8编码输出内容:

$output = shell_exec('LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8 /usr/local/bin/aws s3 ls s3://bucketlocation/folder --recursive');

2. 确认系统存在目标locale

如果执行后仍乱码,先检查系统是否安装了en_US.UTF-8 locale:

locale -a

若输出中无en_US.UTF-8,需先生成:

  • Ubuntu/Debian系统:
    sudo locale-gen en_US.UTF-8
    
  • CentOS/RHEL系统:
    sudo localedef -i en_US -f UTF-8 en_US.UTF-8
    

3. 配置PHP运行环境的locale(PHP-FPM场景)

如果使用PHP-FPM运行,修改www.conf配置文件,添加全局环境变量:

env[LANG] = en_US.UTF-8
env[LC_ALL] = en_US.UTF-8

修改后重启PHP-FPM服务生效。

4. 强制转码修复乱码

若上述方法无效,可尝试对输出内容进行编码转换,忽略无效字符:

$rawOutput = shell_exec('LC_ALL=en_US.UTF-8 /usr/local/bin/aws s3 ls s3://bucketlocation/folder --recursive');
$fixedOutput = iconv('UTF-8', 'UTF-8//IGNORE', $rawOutput);

问题原因分析

  • 直接在终端执行命令时,终端环境已设置UTF-8 locale,aws命令输出UTF-8编码的中文,可正常显示。
  • PHP通过shell_exec/exec调用子进程时,默认继承的环境变量可能未配置UTF-8 locale(如使用POSIX或ASCII),导致中文字符无法被正确编码,显示为??。
  • php.ini中的default_charset仅影响HTTP响应的内容编码,不影响子进程的执行环境编码设置。

验证步骤

可在PHP中执行以下命令,检查当前子进程的locale配置:

var_dump(shell_exec('locale'));

若输出的LC_ALL、LANG等字段不是en_US.UTF-8,说明环境变量配置未生效,需按上述方法调整。

内容的提问来源于stack exchange,提问作者user3783243

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 09:27:23