我在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'
上运行这个完全相同的命令,它会显示文件的媒体信息:
我也相信这是一些字符编码问题,但我不知道如何解决它;- )
1条答案
按热度按时间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字符时,添加以下代码修复了问题:
这似乎确实解决了问题,https://3v4l.org/1DfpF-现在的结果是
'file with Danish æøå.jpg'