glob() nicht finden können, die Dateien mit multibyte-Zeichen unter Windows?
Schreibe ich einen Datei-manager und benötigen zum Scannen von Verzeichnissen und befassen sich mit umbenennen von Dateien mit multibyte-Zeichen. Ich arbeite lokal unter Windows/Apache-PHP 5.3.8, mit den folgenden Dateinamen in einem Verzeichnis:
- filename.jpg
- имяфайла.jpg
- file件name.jpg
- פילענאַמע.jpg
- 文件名.jpg
Test auf einem live-UNIX-server, die unter anderen in Ordnung. Testen lokal auf Windows mit glob('./path/*')
gibt nur die ersten filename.jpg
.
Mit scandir()
, die korrekte Anzahl der Dateien zurückgegeben, mindestens, aber ich bekommen Namen wie ?????????.jpg
(Hinweis: sind regelmäßige Fragezeichen, nicht die � Charakter.
Werde ich am Ende brauchen, schreiben Sie ein "Suche" - Funktion, um die Suche rekursiv durch den ganzen Baum zum passenden Dateinamen ein Muster oder mit einer bestimmten Dateierweiterung, und ich davon ausgegangen glob()
wäre das richtige tool für, dass, eher als scan alle die Dateien und tun, die pattern-matching-und array-Gebäudes in der Anwendung code. Ich bin offen für Alternative Vorschläge, wenn es sein muss.
Vorausgesetzt, dies war ein Allgemeines problem, habe ich sofort bei Google eine Suche und Stack-Überlauf und nichts gefunden auch Verwandte. Ist das ein Windows-Problem? PHP-Mangel? Was ist die Lösung: gibt es irgendetwas, was ich tun kann?
Nachtrag: Nicht sicher, wie der Zusammenhang ist, aber file_exists()
ist auch wieder FALSE
für diese Dateien, die übergabe der vollständigen absoluten Pfad (mit Notepad++, die php-Datei selbst ist UTF-8-Codierung ohne BOM). Ich bin mir sicher, dass der Pfad korrekt ist, wie benachbarte Dateien ohne multibyte-Zeichen zurück TRUE
.
BEARBEITEN: glob()
kann befindet sich eine Datei namens filename-äöü.jpg
. Zuvor in meinem .htaccess
Datei, ich hatte AddDefaultCharset utf-8
, was ich gar nicht überlegen vor. filename-äöü.jpg
Druck war wie filename-���.jpg
. Der einzige Effekt entfernen, die htaccess Zeile zu haben schien, war nun, dass die Datei-Namen druckt normal.
Habe ich gelöscht .htaccess
Datei komplett, und das ist meine eigentliche test Skript in seiner Gesamtheit (ich änderte ein paar Dateinamen aus dem ursprünglichen post):
print_r(scandir('./uploads/'));
print_r(glob('./uploads/*'));
Ausgabe lokal auf 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
)
Ausgang auf entfernten 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
)
Da dies ein anderer server, egal auf welcher Plattform - Konfiguration anders sein könnte, also bin ich nicht sicher, was zu denken, und ich kann nicht voll pin es auf Windows noch (könnte sein, meine PHP-installation, ini-Einstellungen, oder die Apache-config). Irgendwelche Ideen?
- Machst du eine
glob()
mit einem*
Maske? Re???????
Sie sind sicher, dass ist nicht nur ein Zeichen gesetzt mismatch (zwischen dem filesystem-charset und Ihre output-charset)? - ja, hinzu kommen die Muster auf die post, keine Fahnen.
- Ugh, das ist wirklich überraschend Verhalten. 🙁 bist du dir 100% sicher, dass nur 1 element zurückgegeben? Haben Sie eine
print_r()
auf die raw -glob()
Ergebnis? Denken Sie daran, die Funktionen wiejson_encode()
neigen dazu, automatisch löschen-Sachen mit ungültigen Zeichen in Ihnen - Ja, ich habe eine
var_dump()
und es gibt nur 1 Element im array. Gerade raw-PHP ohne zicken. PHP 5.3.8 durch die Art und Weise. - Nicht hier hilfreich; es funktioniert in Linux. Aber beim laufen über
wine php.exe
bekomme ich nur zwei von drei multibyte Dateinamen mit UTF-8-bytes misdecoded als��
. Also ich würde Wetten, die auf charset-Probleme als gut. Aber Sie haben versuchtGlobIterator
statt? - Egoistisch hinzufügen
utf-8
tag, so ich bin sicher, Sie finden diese wieder in der Zukunft. - Ich versuche
GlobIterator
aber kann nicht ankommen es zu starten, auch mit copy/paste-Beispiele aus dem Handbuch. "Uncaught exception 'LogicException' with message 'Die parent-Konstruktor nicht aufgerufen wurde: das Objekt befindet sich in einem ungültigen Zustand" Danke für die Anregung, ich werde daran arbeiten. - Nicht beantworten Ihre Frage und ich bin nicht sicher, ob dies auch lösen, dieses Besondere Problem, aber wenn du offen für die Verwendung von externen Bibliotheken mit Hilfe des Symfony-Finder-Komponente wäre wahrscheinlich eine gute Passform für Ihre end-Ziel.
- Überprüfen Sie die Dokumentation: php.net/manual/en/function.glob.php
- Danke, aber ich bereits habe und es dort nichts gibt. Es fängt an, werden deutlicher, dass dies ein Betriebssystem oder Konfiguration problem, das läuft wahrscheinlich tiefer als nur
glob()
. Vielleicht jemand mit Windows und Apache können, bestätigen diese Ergebnisse? GlobIterator
verhält sich nicht anders, entweder...- Was für ein faszinierendes Thema. Haben Sie versucht, aus
DirectoryIterator
? Ich werde mal ein test-Fall, wenn ich nach Hause komme von der Arbeit und give it a shot, wenn Sie nicht haben. - Ich habe nicht versucht
DirectoryIterator
. Haben Sie sich den verlinkten Artikel in der Antwort, die ich nur angenommen? - +1 von mir für die Frage, ich Suche seit lange Zeit, aber nicht aufgelöst, aber für mich.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sieht es aus wie die glob () - Funktion hängt davon ab, wie Sie Ihre Kopie von PHP gebaut wurde und ob es kompiliert wurde, mit einem unicode-aware WIN32-API (ich glaube nicht, dass der standard builid ist.
Vgl. http://www.rooftopsolutions.nl/blog/filesystem-encoding-and-php
Auszug aus den Kommentaren auf den Artikel:
PHP auf windows nicht verwenden, der Unicode-API noch. So müssen Sie die runtime-encoding (was auch immer es ist) zum Umgang mit nicht-ascii-Zeichensatz.
Beginnend mit PHP 7.1 lang und UTF-8-Pfade auf Windows unterstützt werden, direkt in den Kern.
Versuchen Sie mb_internal_encoding() zu "UTF-8" vor der Verwendung glob