Я пишу файловый менеджер и вам нужно проверять каталоги и обрабатывать переименование файлов, которые могут иметь многобайтовые символы. Я работаю над этим локально в Windows/Apache PHP 5.3.8 со следующими именами файлов в каталоге:
- filename.jpg
- имяфайла .jpg
- Файл 件 name.jpg
- פילענאַמע. JPG
- 文件 名.jpg
Тестирование на реальном сервере UNIX прекратилось. Тестирование локально в Windows с помощью glob('./path/*')
возвращает только первый, filename.jpg
.
Используя scandir()
, верное количество файлов возвращается как минимум, но я получаю имена типа ?????????.jpg
(обратите внимание: это обычные вопросительные знаки, а не символ.
Мне будет нужно написать функцию "поиска" для поиска рекурсивно по всему дереву для имен файлов, соответствующих шаблону или с определенным расширением файла, и я предположил, что glob()
будет правильным инструментом для этого, скорее чем сканировать все файлы и сопоставлять шаблоны и строить массивы в коде приложения. Если есть необходимость, я могу предложить альтернативные предложения.
Предполагая, что это была распространенная проблема, я сразу же искал Google и Qaru и ничего не нашел. Это проблема Windows? Недостаток PHP? Какое решение: есть ли что-нибудь, что я могу сделать?
Приложение: Не знаю, как это связано, но file_exists()
также возвращает FALSE
для этих файлов, передавая полный полный путь (используя Notepad ++, сам файл php является кодировкой UTF-8 без спецификации). Я уверен, что путь правильный, поскольку соседние файлы без многобайтовых символов возвращают TRUE
.
EDIT: glob()
может найти файл с именем filename-äöü.jpg
. Раньше в моем .htaccess
файле у меня был AddDefaultCharset utf-8
, который я раньше не рассматривал. filename-äöü.jpg
печатался как filename-���.jpg
. Единственным эффектом, который удалял эту линию htaccess, было то, что теперь имя файла печатается нормально.
Я полностью удалил файл .htaccess
, и это мой фактический тест script в нем целиком (я изменил пару имен файлов из исходного сообщения):
print_r(scandir('./uploads/'));
print_r(glob('./uploads/*'));
Вывод локально в Windows:
Array
(
[0] => .
[1] => ..
[2] => ??? ?????.jpg
[3] => ???.jpg
[4] => ?????????.jpg
[5] => filename-äöü.jpg
[6] => filename.jpg
[7] => test?test.jpg
)
Array
(
[0] => ./uploads/filename-äöü.jpg
[1] => ./uploads/filename.jpg
)
Вывод на удаленном сервере UNIX:
Array
(
[0] => .
[1] => ..
[2] => filename-äöü.jpg
[3] => filename.jpg
[4] => test이test.jpg
[5] => имя файла.jpg
[6] => פילענאַמע.jpg
[7] => 文件名.jpg
)
Array
(
[0] => ./uploads/filename-äöü.jpg
[1] => ./uploads/filename.jpg
[2] => ./uploads/test이test.jpg
[3] => ./uploads/имя файла.jpg
[4] => ./uploads/פילענאַמע.jpg
[5] => ./uploads/文件名.jpg
)
Поскольку это другой сервер, независимо от платформы - настройка может быть разной, поэтому я не уверен, что думать, и я не могу полностью подключить ее к Windows еще (может быть, моя установка PHP, ini настройки или Конфигурация Apache). Любые идеи?