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

PHP exec无法访问含丹麦语特殊字符的文件问题求助

问题:PHP exec调用mediainfo无法识别含丹麦语特殊字符的文件

在CentOS服务器上搭建网页,需要遍历所有照片和视频并在页面展示。但发现当文件名包含丹麦语特殊字符(如æøåÆØÅ)时,PHP的exec命令无法访问该文件——我必须使用exec调用mediainfo工具来获取媒体(视频、音频或图片)的格式及其他详情。

待遍历的文件夹和文件数组

$folder = "!My Folder"; // 父文件夹包含特殊字符

$files = [
    [
        'filename' => '!file #2.jpg',
        'descr' => 'File with special chars, but no national chars'
    ],
    [
        'filename' => 'file with Danish æøå.jpg',
        'descr' => 'File with Danish chars, but no special chars'
    ],
    [
        'filename' => 'file with no special.jpg',
        'descr' => 'File with nothing special'
    ]
];

当前使用的PHP代码

$param = escapeshellarg("$folder/$filename"); // 转义文件参数
exec("mediainfo $param", $outputArray); // 将逐行输出存储到数组中

执行结果

代码对文件[0]和[2]能正常返回填充后的数组,但文件[1]仅返回空数组:

Array
(
    [0] => 
)

终端执行验证

直接在服务器终端执行mediainfo命令能正常获取该文件的详细数据:

[usr@srv !My Folder]# mediainfo file\ with\ Danish\ æøå.jpg

环境说明:使用PHP 8.1,通过Samba访问或存储含丹麦字符的文件并无问题。重命名文件是替代方案,但希望避免这种“破坏性”操作(改动原文件),请问有什么办法能让exec访问这类文件?


更新1 - 仍未解决

为明确问题与exec相关,添加设置PHP区域字符编码的代码并输出exec命令:

setlocale(LC_CTYPE, "en_US.UTF-8");
$param = escapeshellarg("$folder/$filename");
exec("mediainfo $param", $outputArray);
echo "mediainfo $param";

echo输出内容如下(同时返回空数组):

mediainfo '/server/original/!My Folder/file with Danish æøå.jpg'

但直接在服务器执行这条完全相同的命令,却能正常显示该文件的媒体信息。认为这是字符编码问题,但尚未找到解决办法。


更新2 - 仍未解决

按照建议尝试设置环境变量并改用shell_exec(),结果相同:

putenv("LANG=en_US.UTF-8");

$folder = "!My Folder"; // 父文件夹包含特殊字符
$filename = "file with Danish æøå.jpg";

$param = escapeshellarg("$folder/$filename");
$output = shell_exec("mediainfo $param");
$outputArray = explode("\n",$output);
print_r($outputArray);

执行后得到包含两个空值的数组:

Array
(
    [0] => 
    [1] => 
)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 16:39:52