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] => testtest.jpg
    [5] => имя файла.jpg
    [6] => פילענאַמע.jpg
    [7] => 文件名.jpg
)
Array
(
    [0] => ./uploads/filename-äöü.jpg
    [1] => ./uploads/filename.jpg
    [2] => ./uploads/testtest.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 wie json_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 versucht GlobIterator 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.

InformationsquelleAutor Wesley Murch | 2012-03-11
Schreibe einen Kommentar