PHP не читает размер папки, когда каталог содержит акцентированные символы - PullRequest
0 голосов
/ 12 марта 2019

Я нахожусь на 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: 

1 Ответ

1 голос
/ 12 марта 2019

Как мы обнаружили в комментариях, вы можете сделать это:

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

Я получил вдохновение для этого из комментария на странице документа PHP для escapeshellarg

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

Когда escapeshellarg () удалял мои не-ASCII символы из строки UTF-8, добавление следующего исправило проблему: setlocale(LC_CTYPE, "en_US.UTF-8");

Я заметил, что в ваших результатах отладки вы просто повторяли $path, когда мы действительно хотим видеть результаты escapeshellarg, которые передаются в командную строку, а не ее ввод. Проверив, что проблема стала более понятной.

Также, когда я проверял это в песочнице, оказалось, что они не удаляются, поэтому я не был уверен, что это сработает. Но я знаю, что при просмотре вещей в Интернете многое зависит от настроек сервера, типов контента и т. Д. В обоих случаях я не могу точно знать, потому что я не знаю, какой сервер (ваш или песочница) установка.

Так что я решил, что стоит упомянуть.

Код песочницы:

 echo escapeshellarg("fooščü");

выход

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

Песочница

Я оставил комментарий выше для потомков.

Лично я никогда не сталкивался с этой проблемой, поэтому я рад, что мы смогли решить ее.

Ура!

...