Dies hängt mit diesem Stapelüberlauf-Beitrag zusammen:
glob () kann unter Windows keine Dateinamen mit Multibyte-Zeichen finden?
Ich habe Probleme mit PHP und Dateien mit Multibyte-Zeichen unter Windows. Hier ist mein Testfall:
print_r(scandir('./uploads/'));
print_r(glob('./uploads/*'));
Richtige Ausgabe auf einem Remote-UNIX-Server:
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
)
Lokale Ausgabe unter Windows falsch :
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
)
Hier ist ein relevanter Auszug aus der Antwort, die ich akzeptiert habe (was eigentlich ein Zitat aus einem Artikel ist, der vor über 2 Jahren online gestellt wurde):
Aus den Kommentaren zu diesem Artikel: http://www.rooftopsolutions.nl/blog/filesystem-encoding-and-php
Die Ausgabe Ihrer PHP-Installation unter Windows ist leicht zu erklären: Sie haben die falsche Version von PHP installiert und eine Version verwendet, die nicht für die Verwendung der Unicode-Version der Win32-API kompiliert wurde. Aus diesem Grund verwenden die von PHP verwendeten Dateisystemaufrufe die ältere "ANSI" -API, und daher versuchen die mit dieser PHP-Version verknüpften C / C ++ - Bibliotheken zunächst, Ihre UTF-8-codierte PHP-Zeichenfolge in die lokale "ANSI" -Konvertierung zu konvertieren. In der laufenden Umgebung ausgewählte Codepage (siehe CHCP-Befehl, bevor PHP über ein Befehlszeilenfenster gestartet wird)
Ihre Windows-Version ist wahrscheinlich NICHT für diese seltsame Sache verantwortlich. Tatsächlich ist dies IHRE Version von PHP, die nicht korrekt kompiliert wurde und die ältere ANSI-Version der Win32-API verwendet (aus Kompatibilitätsgründen mit den älteren 16-Bit-Versionen von Windows 95/98, deren Dateisystemunterstützung im Kernel tatsächlich keine direkte hatte Unterstützung für Unicode, jedoch Verwendung einer internen Konvertierungsschicht zum Konvertieren von Unicode in die lokale ANSI-Codepage vor Verwendung der tatsächlichen ANSI-Version der API).
Kompilieren Sie PHP mit der Compiler-Option neu, um die UNICODE-Version der Win32-API zu verwenden (dies sollte heute der Standard sein und ohnehin immer der Standard für PHP, das auf einem Server installiert ist, der NIEMALS Windows 95 oder Windows 98 sein wird ...).
Ich kann nicht bestätigen, ob dies mein Problem ist oder nicht. Ich phpinfo()
habe etwas Interessantes benutzt und fand es nicht interessant, aber ich war mir nicht sicher, wonach ich suchen sollte. Ich habe XAMPP für einfache Installationen verwendet, daher bin ich mir nicht sicher, wie es genau installiert wurde.
Ich verwende Windows 7, 64-Bit - verzeihen Sie also meine Unwissenheit, aber ich bin mir nicht einmal sicher, ob "Win32" hier relevant ist. Wie kann ich überprüfen, ob meine aktuelle Version von PHP mit der oben genannten Konfiguration kompiliert wurde?
- PHP-Version : 5.3.8
- System : Windows NT WES-PC 6.1 Build 7601 (Windows 7 Home Premium Edition Service Pack 1) i586
- Herstellungsdatum : 23. August 2011 11.47.20
- Compiler : MSVC9 (Visual C ++ 2008)
- Architektur : x86
- Befehl konfigurieren :
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"
Falls es relevant ist oder nützliche Informationen enthält, hier ein Screenshot von mir phpinfo()
(Abschnitt mbstring):
Wie kann ich herausfinden, ob meine PHP-Installation "mit der UNICODE-Version der Win32-API kompiliert" wurde? (Und macht das überhaupt Sinn?)