Це пов’язано з цією публікацією переповнення стека:
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 API Win32. З цієї причини виклики файлової системи, використовувані PHP, використовуватимуть застарілий API "ANSI", і тому бібліотеки C / C ++, пов'язані з цією версією PHP, спершу спробують перетворити юту PHP-кодовану PHP-рядок у локальну "ANSI" кодова сторінка, вибрана в середовищі запуску (див. команду CHCP перед запуском PHP у вікні командного рядка)
Ваша версія Windows НАЙБІЛЬШЕ ВІДПОВІДНО НЕ відповідає за цю дивну річ. Насправді, це ВАША версія PHP, яка не скомпільована належним чином і яка використовує застарілу версію ANSI API Win32 (для сумісності із застарілими 16-бітовими версіями Windows 95/98, підтримка яких у ядрі фактично не мала прямої версії) підтримка Unicode, але використовувався внутрішній шар перетворення для перетворення Unicode на локальну кодову сторінку ANSI перед тим, як використовувати фактичну версію API ANSI).
Перекомпілюйте PHP, використовуючи параметр компілятора, щоб використовувати версію UNICODE API Win32 (яка повинна бути за замовчуванням сьогодні, і все одно завжди типовою для PHP, встановленої на сервері, який НІКОЛИ не буде Windows 95 або Windows 98 ...)
Я не можу підтвердити, це моя проблема чи ні. Я використовував phpinfo()
і нічого цікавого не знаходив, але не знав, що шукати. Я використовував XAMPP для легких установок, тому я дійсно не впевнений, як саме він був встановлений.
Я використовую Windows 7, 64 біт - тож пробачте моє незнання, але я навіть не впевнений, чи доречний тут "Win32". Як я можу перевірити, чи була складена моя поточна версія PHP із згаданою вище конфігурацією?
- Версія PHP : 5.3.8
- Система : Windows NT WES-PC 6.1 build 7601 (Windows 7 Home Premium Edition Service Pack 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 section):
Як я можу дізнатися, чи була моя інсталяція PHP "зібрана з версією UNICODE API Win32"? (і чи це насправді має сенс?)