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

