Это связано с этим постом переполнения стека:
glob () не может найти имена файлов с многобайтовыми символами в Windows?
У меня проблемы с PHP и файлами с многобайтовыми символами в Windows. Вот мой тестовый пример:
print_r(scandir('./uploads/'));
print_r(glob('./uploads/*'));
Правильный вывод на удаленный сервер 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:
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
)
Вот соответствующая выдержка из ответа, который я решил принять (на самом деле это цитата из статьи, которая была размещена в сети более 2 лет назад):
Из комментариев к этой статье: http://www.rooftopsolutions.nl/blog/filesystem-encoding-and-php
Вывод вашей установки PHP в Windows легко объяснить: вы установили неправильную версию PHP и использовали версию, не скомпилированную для использования Unicode-версии Win32 API. По этой причине вызовы файловой системы, используемые PHP, будут использовать устаревший API «ANSI», и поэтому библиотеки C / C ++, связанные с этой версией PHP, сначала будут пытаться преобразовать строку PHP в кодировке UTF-8 в локальную «ANSI». кодовая страница, выбранная в рабочей среде (см. команду CHCP перед запуском PHP из окна командной строки)
Ваша версия Windows САМАЯ ВЕРОЯТНО НЕ несет ответственности за эту странную вещь. На самом деле, это ВАША версия PHP, которая неправильно скомпилирована и использует устаревшую ANSI-версию Win32 API (для совместимости с устаревшими 16-разрядными версиями Windows 95/98, поддержка файловой системы в ядре которой фактически не имела прямой поддержка Unicode, но использовал внутренний уровень преобразования для преобразования Unicode в локальную кодовую страницу ANSI перед использованием фактической версии API ANSI).
Перекомпилируйте PHP, используя опцию компилятора, чтобы использовать UNICODE-версию Win32 API (которая должна быть по умолчанию сегодня, и в любом случае всегда по умолчанию для PHP, установленного на сервере, который НИКОГДА не будет Windows 95 или Windows 98 ...)
Я не могу подтвердить, является ли это моей проблемой или нет. Я использовал phpinfo()
и не нашел ничего интересного, но я не был уверен, что искать. Я использовал XAMPP для простой установки, поэтому я не совсем уверен, как именно он был установлен.
Я использую 64-битную Windows 7 - так что прости мое невежество, но я даже не уверен, что здесь "Win32" имеет значение. Как я могу проверить, была ли моя текущая версия PHP скомпилирована с конфигурацией, упомянутой выше?
- Версия PHP : 5.3.8
- Система : Windows NT WES-PC 6.1 сборка 7601 (Windows 7 Home Premium Edition с пакетом обновления 1) i586
- Дата постройки: 23 августа 2011 11:47:20
- Компилятор : MSVC9 (Visual C ++ 2008)
- Архитектура : x86
- Настроить команду :
cscript /nologo configure.js "--enable-snapshot-build" "--disable-isapi" "--enable-debug-pack" "--disable-isapi" "--without-mssql" "--without-pdo-mssql" "--without-pi3web" "--with-pdo-oci=D:\php-sdk\oracle\instantclient10\sdk,shared" "--with-oci8=D:\php-sdk\oracle\instantclient10\sdk,shared" "--with-oci8-11g=D:\php-sdk\oracle\instantclient11\sdk,shared" "--enable-object-out-dir=../obj/" "--enable-com-dotnet" "--with-mcrypt=static" "--disable-static-analyze"
В случае, если это уместно или показывает какую-либо полезную информацию, вот мой скриншот phpinfo()
(раздел mbstring):
Как я могу узнать, была ли моя установка PHP "скомпилирована с UNICODE-версией Win32 API"? (и имеет ли это какой-то смысл?)