Jest to związane z tym postem przepełnienia stosu:
glob () nie może znaleźć nazw plików ze znakami wielobajtowymi w systemie Windows?
Mam problemy z PHP i plikami, które mają znaki wielobajtowe w systemie Windows. Oto mój przypadek testowy:
print_r(scandir('./uploads/'));
print_r(glob('./uploads/*'));
Prawidłowe wyjście na zdalnym serwerze 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
)
Niepoprawne dane wyjściowe lokalnie w systemie 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
)
Oto odpowiedni fragment odpowiedzi, którą zdecydowałem się zaakceptować (która w rzeczywistości jest cytatem z artykułu opublikowanego online ponad 2 lata temu):
Z komentarzy do tego artykułu: http://www.rooftopsolutions.nl/blog/filesystem-encoding-and-php
Dane wyjściowe z instalacji PHP w systemie Windows można łatwo wyjaśnić: zainstalowałeś niewłaściwą wersję PHP i użyłeś wersji nieskompilowanej do korzystania z wersji Win32 API interfejsu Unicode. Z tego powodu wywołania systemu plików używane przez PHP będą używać starszego API „ANSI”, więc biblioteki C / C ++ połączone z tą wersją PHP najpierw spróbują przekonwertować ciąg PHP zakodowany w UTF-8 na lokalny „ANSI” strona kodowa wybrana w uruchomionym środowisku (zobacz komendę CHCP przed uruchomieniem PHP z okna wiersza poleceń)
Twoja wersja systemu Windows NIE JEST PRAWDOPODOBNIE odpowiedzialna za tę dziwną rzecz. W rzeczywistości jest to TWOJA wersja PHP, która nie jest poprawnie skompilowana i która korzysta ze starszej wersji interfejsu API Win32 systemu Win32 (w celu zachowania zgodności ze starszymi 16-bitowymi wersjami systemu Windows 95/98, których obsługa systemu plików w jądrze nie miała bezpośredniego obsługa Unicode, ale użyła wewnętrznej warstwy konwersji do konwersji Unicode na lokalną stronę kodową ANSI przed użyciem rzeczywistej wersji interfejsu API ANSI).
Ponownie skompiluj PHP przy użyciu opcji kompilatora, aby użyć UNICODE wersji Win32 API (która powinna być dzisiaj domyślna, a zresztą zawsze domyślna dla PHP zainstalowanego na serwerze, który NIGDY nie będzie Windows 95 lub Windows 98 ...)
Nie mogę potwierdzić, czy to mój problem, czy nie. Użyłem phpinfo()
i nie znalazłem niczego interesującego, ale nie byłem pewien, czego szukać. Używam XAMPP do łatwej instalacji, więc naprawdę nie jestem pewien, jak dokładnie został zainstalowany.
Korzystam z systemu Windows 7, wersja 64-bitowa - więc wybacz moją ignorancję, ale nie jestem nawet pewien, czy „Win32” jest tutaj istotny. Jak mogę sprawdzić, czy moja bieżąca wersja PHP została skompilowana z wyżej wymienioną konfiguracją?
- Wersja PHP : 5.3.8
- System : Windows NT WES-PC 6.1 build 7601 (Windows 7 Home Premium Edition Service Pack 1) i586
- Data kompilacji : 23 sierpnia 2011 11:47:20
- Kompilator : MSVC9 (Visual C ++ 2008)
- Architektura : x86
- Skonfiguruj polecenie :
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"
W przypadku, gdy jest to istotne lub ujawnia przydatne informacje, oto zrzut ekranu mojego phpinfo()
(sekcja mbstring):
Jak mogę się dowiedzieć, czy moja instalacja PHP została „skompilowana z UNICODE wersją Win32 API”? (i czy to ma jakiś sens?)