Как правильно считывать имена файлов, содержащие нестандартные символы с умляутами типа "Č", "Á"?

bicyclist

Новичок
Мой код, который должен отсканировать и переименовать все файлы в определённом каталоге:
Код:
$dir = 'files';
 
$files_in_folder = scandir($dir);
 
echo '<pre>'; print_r($files_in_folder); echo '</pre>';
$new_name = 0;
foreach($files_in_folder as $k => $v){
    rename($dir.'/'.$v, $dir.'/'.$new_name);
    $new_name ++;
}
Когда в каталоге есть файл с названием "Patricia JANEČKOVÁ.mp4", скрипт видит его название как "Patricia JANECKOVA.mp4" и попытка переименования заканчивается неудачей.
как сделать чтобы функция scandir считывала название файла со всеми нестандартными символами, и что бы по считанному названию можно было проводить операции с файлом, например переименование?
 
не знаю, что там на сервере стоит
Скрипт не переименовывает файл, название остаётся прежним. То есть scandir некорректно считывает название, и rename не может найти файл по этому некорректному названию.
скрипт возвращает:
Код:
Array
(
    [0] => .
    [1] => ..
    [2] => 2
    [3] => Patricia JANECKOVA.mp4
)
 
 
Warning: rename(files/Patricia JANECKOVA.mp4,files/1): �� ������ ����� �������� ����. (code: 2) in Z:\home\localhost\www\TEST_SCRIPTS\files_scan\index.php on line 19
ещё и с кодировкой какая-то проблема
 
scandir сканирует все файлы в папке. название сканируемой папки находится в переменной $dir.
Отсканированные файлы перебираются в цикле и переименовываются на "0", "1", "2" и т. д.
особого применения скрипт не имеет, просто для теста. Показывает, что файлы с нестандартными символами в названии так переименовать нельзя.
 
начни с простого
PHP:
foreach(scandir('files') as $file){
    echo $file. ' --> '. urlencode($file) . "\n";
}
покажи вывод (только не то что браузер показывает, а source)

не знаю, что там на сервере стоит
тебе придется узнать, наверняка работающий код на твоем локальном windows не будет работать на linux
 
bicyclist, на самом деле "не надо" ничего менять. Грамотную логистику файлов, включая формирование имени файла (например id из БД + транслит) надо производить на этапе загрузки. Имена файлов необходимо хранить в БД. Это позволит для одного файла хранить неограниченное количество имён (включая временные). И переименовывать если потребуется необходимо в самой БД, а не на диске.
 

не знаю, что там на сервере стоит

То есть, выходит, все же проблемы у тебя локально под виндой, а не на сервере?

Под виндой эти проблемы решать себе дороже, забей.

Если вдруг на сервере тоже винда и винду там почему-то очень надо, то начиная с PHP 7.1 на всё это дело влияют настройки default_charset и/или internal_encoding - поиграйся, должно помочь (теоретически). Хотя даже и с виндой в разы проще будет запустить PHP под WSL2.
 
fixxxer, я никогда не был ярым адептом linux призывающим сжигать мелкософтовых и всегда говорил, что для хобби достаточно Windows + OpenServer (а давно давно даже denwer хватало). Но НТП не стоит на месте, сейчас в интернете полно информации. Можно легко единожды установить linux второй системой и готовую сборку docker (например эту https://github.com/sprintcube/docker-compose-lamp) и программировать в своё удовольствие.
 
fixxxer, я никогда не был ярым адептом linux призывающим сжигать мелкософтовых и всегда говорил, что для хобби достаточно Windows + OpenServer (а давно давно даже denwer хватало). Но НТП не стоит на месте, сейчас в интернете полно информации. Можно легко единожды установить linux второй системой и готовую сборку docker (например эту https://github.com/sprintcube/docker-compose-lamp) и программировать в своё удовольствие.
а что было непонятно в его предложении WSL2, зачем костыли?
 
Боюсь у меня с вами разное представление о костылях.
ну да, в 2022 ставить стек с apache и phpmyadmin - это даже костылями назвать сложно. Это тот самый Денвер. Только не сборка, а из из мультика - динозавр проснувшийся в современном мире.
 
Теперь я начинаю немножко понимать. Вы соврешенно не на том акцентируете своё внимание. Видимо тоже самое происходит не только тут.

Я всего лишь сказал, что настало время, когда установить для работы или даже хобби полноценный Linux стало абсолютно не сложно.
Собрать самому нужное под докер сложнее, поэтому я посоветовал готовую сборку (кстати по сути дистрибутив линукса - это тоже сборка, и на моей памяти были неадекваты советующие собрать себе свой линукс, только ради того что бы написать echo "Привет Мир"). Посоветовал первую попавшуюся сборку для докера которая оказалась "под рукой".

Ну и надо понимать, что обращаясь к fixxxer, я не имел ввиду, что он чего-то не знает и ему срочно надо ставить именно эту сборку, а просто для поддержания разговора в надежде, что ТС обратит внимание на этот пост и установит хотя бы то, что там написано, а если в последствии этого станет мало, найдёт готовое или соберёт сам под свои нужды я буду только рад.
 
начни с простого
PHP:
foreach(scandir('files') as $file){
    echo $file. ' --> '. urlencode($file) . "\n";
}
покажи вывод (только не то что браузер показывает, а source)


тебе придется узнать, наверняка работающий код на твоем локальном windows не будет работать на linux
<br>. --&gt; .
<br>.. --&gt; ..
<br>0 --&gt; 0
<br>Patricia JANECKOVA.mp4 --&gt; Patricia+JANECKOVA.mp4
 
А у кого-нибудь на каком-нибудь сервере файл с таким названием получилось успешно отсканировать и переименовать?
 
интересно, что во всем выводе > заменяется на сущности, этого в коде нет, но не суть, не мешает.
но нет, я не увидел ни одного спец символа, ну это microsoft, поверю что обманывает, еще сам не врублюсь как ему объяснить что хочется
 
phpinfo() показывайте. Скорее всего что-то с кодировкой ввода-вывода.
 
А у кого-нибудь на каком-нибудь сервере файл с таким названием получилось успешно отсканировать и переименовать?
нормально везде работает и в винде и в линуксе.

У тебя " .... in Z:\home\localhost\www " поже сетевой диск примотирован и utf срезается в 1251 или ISO, так что это не проблема php.
 
нормально везде работает и в винде
В винде "нормально" будет работать, только если кодировка файла скрипта совпадает с системной страницей кодировки винды, или явно на нее переключится, или конвертировать такие пути перед вызовом системных функций.
 
В винде "нормально" будет работать, только если кодировка файла скрипта совпадает с системной страницей кодировки винды, или явно на нее переключится, или конвертировать такие пути перед вызовом системных функций.

windows 10, php 7.4 читает переименовывает, файлы.
Специально сдеал пару файлов с имеами из китайских иероглифов кроме буковок с точками и шляпками. :)
 
Сверху