centos PHP“exec”无法访问包含丹麦语字符的文件名?

r7s23pms  于 2022-11-07  发布在  PHP
关注(0)|答案(1)|浏览(110)

我在CentOS服务器上创建了一个网页,我想遍历我所有的照片和视频,然后在我的页面上显示它们。然而,当文件中包含我们丹麦的国家字符时,如æøåÆØÅ,则我的exec命令无法访问该文件-我需要exec命令,因为我需要mediainfo来显示和-说明文件的格式和其他详细信息(视频、音频或图像)。
让我们假设我有这个数据和数组,我正在遍历(3个文件):

$folder = "!My Folder"; // parent folder has a special char

Array
(
    [0] => Array
        (
            [filename] => !file #2.jpg
            [descr] => File with special chars, but no national chars

        )
    [1] => Array
        (
            [filename] => file with Danish æøå.jpg
            [descr] => File with Danish chars, but no special chars
        )
    [2] => Array
        (
            [filename] => file with no special.jpg
            [descr] => File with nothing special
        )
)

然后我从PHP中阅读mediainfo信息,如下所示:

$param = escapeshellarg("$folder/$filename"); // escape file argument
exec("mediainfo $param", $outputArray); // store line-by-line output in an array

对于文件[0][2](我得到了一个填充的数组),这个方法很好用,但是[1]只从输出中返回一个空数组:

Array
(
    [0] => 
)

需要注意的是,我可以直接在服务器上使用mediainfo,这样做 * 将 * 工作正常并返回详细数据:

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

所以似乎是exec在这方面有一些问题?
我使用的是PHP8.1,使用这些丹麦字符通过桑巴舞访问或存储服务器上的文件没有问题。
另一种解决方案是使用这些字符重命名文件,但理想情况下,我希望避免这样做,因为这是一种“破坏性”(与原始文件混淆)。
有人知道如何通过exec访问这些文件吗?

###更新-但仍无解决方案###

为了让它清晰明了,并“证明”这是与exec相关的东西,我参考了下面@CBroe的答案,并添加了一行额外的代码来设置PHP中的区域设置字符编码,setlocale+输出exec命令:

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

echo将输出以下内容(以及一个空数组):
我的文件夹/file with Danish/server/我的文件夹/file with Danish/server/我的文件夹/file with Danish.jpg
但如果我直接在服务器mediainfo '/server/original/!My Folder/file with Danish æøå.jpg'上运行这个完全相同的命令,它会显示文件的媒体信息:

我也相信这是一些字符编码问题,但我不知道如何解决它;- )

wqsoz72f

wqsoz72f1#

https://3v4l.org/FEWfI上测试echo escapeshellarg("file with Danish æøå.jpg");只得到'file with Danish .jpg'作为结果。
查看用户对该功能的评论,有https://www.php.net/manual/en/function.escapeshellarg.php#99213:
当escapeshellarg()从UTF-8字符串中剥离非ASCII字符时,添加以下代码修复了问题:

<?php
setlocale(LC_CTYPE, "en_US.UTF-8");
?>

这似乎确实解决了问题,https://3v4l.org/1DfpF-现在的结果是'file with Danish æøå.jpg'

相关问题