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

问题描述 投票:0回答:1

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

我正在使用以下代码:

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

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

我能做些什么才能让它发挥作用?

样本输出:

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: 
php character size diacritics
1个回答
1
投票

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

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

我从escapeshellarg的PHP文档页面的评论中获得了灵感

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

当escapeshellarg()从UTF-8字符串中剥离我的非ASCII字符时,添加以下内容解决了问题:setlocale(LC_CTYPE, "en_US.UTF-8");

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

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

所以我觉得值得一提。

沙箱代码:

 echo escapeshellarg("fooščü");

产量

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

Sandbox

我把上面的评论放在后面。

就个人而言,我从未遇到过这个问题,所以我很高兴我们能够解决这个问题。

干杯!

© www.soinside.com 2019 - 2024. All rights reserved.