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
我为后代保留了上面的评论。
就我个人而言,我从未 运行 处理过这个问题,所以我很高兴我们能够解决它。
干杯!
我在 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
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
我为后代保留了上面的评论。
就我个人而言,我从未 运行 处理过这个问题,所以我很高兴我们能够解决它。
干杯!