PHP 当目录包含重音字符时不读取文件夹大小

PHP doesn't read folder size when directory contains accented characters

我在 Ubuntu 上,我有一些包含特殊字符的目录,例如“š”、“č”、“ü”等。

我正在使用以下代码:

$path = "/var/www/html/folder/$var1";
$io = popen ( '/usr/bin/du -sk ' . escapeshellarg($path), 'r' );
$size = fgets ( $io );

我使用 escapeshellarg($path) 因为我的一些目录包含空格,这个解决方案工作正常,并且在我的网站上显示 $path 时,它显示正确。但是,对于具有特殊字符的目录,$size 不会 return 任何内容。

我该怎么做才能让它发挥作用?

示例输出:

echo 'Directory: ' . $path . ' => Size: ' . $size . '<br>';


Directory: /var/www/html/folder/y/x => Size: 3464
Directory: /var/www/html/folder/ü/x => Size: 
Directory: /var/www/html/folder/š/x => Size: 

正如我们在评论中发现的那样,您可以这样做:

setlocale(LC_CTYPE, "en_US.UTF-8");

我从 escapeshellarg

的 PHP 文档页面上的评论中得到灵感

http://php.net/manual/en/function.escapeshellarg.php#99213

When escapeshellarg() was stripping my non-ASCII characters from a UTF-8 string, adding the following fixed the problem: setlocale(LC_CTYPE, "en_US.UTF-8");

我注意到在你的调试输出中你只是在回显 $path 而我们真正想看到的是 escapeshellarg 的结果,这是传递给命令行的结果,而不是输入。检查后发现问题更清楚了

另外,当我在沙箱中测试它时,它似乎没有删除那些,所以我不确定它是否有效。但我知道在网络上查看内容在很大程度上取决于服务器设置、内容类型等。在这两种情况下,我都无法真正知道,因为我不知道服务器(你的或沙箱)是怎样的设置。

所以我觉得值得一提。

沙盒代码:

 echo escapeshellarg("fooščü");

输出

'fooščü' //looks like it didnt remove them

Sandbox

我为后代保留了上面的评论。

就我个人而言,我从未 运行 处理过这个问题,所以我很高兴我们能够解决它。

干杯!