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

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 считывала название файла со всеми нестандартными символами, и что бы по считанному названию можно было проводить операции с файлом, например переименование?
 

bicyclist

Новичок
не знаю, что там на сервере стоит
Скрипт не переименовывает файл, название остаётся прежним. То есть 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
ещё и с кодировкой какая-то проблема
 

bicyclist

Новичок
scandir сканирует все файлы в папке. название сканируемой папки находится в переменной $dir.
Отсканированные файлы перебираются в цикле и переименовываются на "0", "1", "2" и т. д.
особого применения скрипт не имеет, просто для теста. Показывает, что файлы с нестандартными символами в названии так переименовать нельзя.
 

WMix

герр M:)ller
Партнер клуба
начни с простого
PHP:
foreach(scandir('files') as $file){
    echo $file. ' --> '. urlencode($file) . "\n";
}
покажи вывод (только не то что браузер показывает, а source)

не знаю, что там на сервере стоит
тебе придется узнать, наверняка работающий код на твоем локальном windows не будет работать на linux
 

Valick

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

fixxxer

К.О.
Партнер клуба
не знаю, что там на сервере стоит
То есть, выходит, все же проблемы у тебя локально под виндой, а не на сервере?

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

Если вдруг на сервере тоже винда и винду там почему-то очень надо, то начиная с PHP 7.1 на всё это дело влияют настройки default_charset и/или internal_encoding - поиграйся, должно помочь (теоретически). Хотя даже и с виндой в разы проще будет запустить PHP под WSL2.
 

Valick

Новичок
fixxxer, я никогда не был ярым адептом linux призывающим сжигать мелкософтовых и всегда говорил, что для хобби достаточно Windows + OpenServer (а давно давно даже denwer хватало). Но НТП не стоит на месте, сейчас в интернете полно информации. Можно легко единожды установить linux второй системой и готовую сборку docker (например эту https://github.com/sprintcube/docker-compose-lamp) и программировать в своё удовольствие.
 

AmdY

Пью пиво
Команда форума
fixxxer, я никогда не был ярым адептом linux призывающим сжигать мелкософтовых и всегда говорил, что для хобби достаточно Windows + OpenServer (а давно давно даже denwer хватало). Но НТП не стоит на месте, сейчас в интернете полно информации. Можно легко единожды установить linux второй системой и готовую сборку docker (например эту https://github.com/sprintcube/docker-compose-lamp) и программировать в своё удовольствие.
а что было непонятно в его предложении WSL2, зачем костыли?
 

AmdY

Пью пиво
Команда форума
Боюсь у меня с вами разное представление о костылях.
ну да, в 2022 ставить стек с apache и phpmyadmin - это даже костылями назвать сложно. Это тот самый Денвер. Только не сборка, а из из мультика - динозавр проснувшийся в современном мире.
 

Valick

Новичок
Теперь я начинаю немножко понимать. Вы соврешенно не на том акцентируете своё внимание. Видимо тоже самое происходит не только тут.

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

Ну и надо понимать, что обращаясь к fixxxer, я не имел ввиду, что он чего-то не знает и ему срочно надо ставить именно эту сборку, а просто для поддержания разговора в надежде, что ТС обратит внимание на этот пост и установит хотя бы то, что там написано, а если в последствии этого станет мало, найдёт готовое или соберёт сам под свои нужды я буду только рад.
 

bicyclist

Новичок
начни с простого
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
 

bicyclist

Новичок
А у кого-нибудь на каком-нибудь сервере файл с таким названием получилось успешно отсканировать и переименовать?
 

WMix

герр M:)ller
Партнер клуба
интересно, что во всем выводе > заменяется на сущности, этого в коде нет, но не суть, не мешает.
но нет, я не увидел ни одного спец символа, ну это microsoft, поверю что обманывает, еще сам не врублюсь как ему объяснить что хочется
 

AnrDaemon

Продвинутый новичок
phpinfo() показывайте. Скорее всего что-то с кодировкой ввода-вывода.
 

Тугай

Новичок
А у кого-нибудь на каком-нибудь сервере файл с таким названием получилось успешно отсканировать и переименовать?
нормально везде работает и в винде и в линуксе.

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

флоппик

promotor fidei
Команда форума
Партнер клуба
нормально везде работает и в винде
В винде "нормально" будет работать, только если кодировка файла скрипта совпадает с системной страницей кодировки винды, или явно на нее переключится, или конвертировать такие пути перед вызовом системных функций.
 

Тугай

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