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
相关产品推荐
相关产品推荐

