2012-04-04 15 views
3

Ich verwende Windows 2003, um etwas PHP-Code zu schreiben. Ich benutze XAMPP Portable (kopiere nach D :). Das Problem:Verzeichnisse auflisten, die Unicode-Zeichen unter Windows enthalten

$path = 'D:\ebooks'; 
$all_file = scandir($path); 
foreach ($all_file as $file) { 
    if (is_dir("$path/$file") && $file != '.' && $file != '..') { 
    echo $file . "<br />\n"; 
    } 
} 

Als ich das Drehbuch (mit Browser) aufrufen, ich habe nicht alle Verzeichnisse sehen (in D: \ ebooks), die ein Unicode-Zeichen (I mit Vietnamese, getestet Japanisch, Chinesisch, Tschechisch) .

Aber wenn ich is_dir("$path/$file") entfernen, zeigen die Verzeichnisse mit vielen seltsamen Charaktere und viele ??? Zeichen.

Wie kann ich das Problem lösen?

+0

Was meinst du mit "Unicode-Name"? Du meinst Sonderzeichen wie Ô oder ü? –

+0

Der Teil "viele seltsame Zeichen" hängt möglicherweise mit Ihrer Codierung der Browserausgabe zusammen. – cmbuckley

Antwort

6

Leider gibt es eine Menge Fehler im Zusammenhang mit PHP-Zugriff auf ein Windows-Dateisystem. Während Windows die Dateinamen als UTF-16 speichert, verwenden die Interna von PHP die viel älteren ANSI-APIs. Daher ist es am besten, nur mit Dateinamen im Ascii-Bereich zu arbeiten oder zu einem anderen Betriebssystem zu wechseln.

+2

+1 für 'Wechseln zu einem anderen Betriebssystem' :-) – cmbuckley

+1

@cbuckley: Normalerweise würde ich Leute davon abhalten, das zu sagen, aber in diesem Fall ist es einfach Tatsache, dass PHP unter Windows wirklich Scheiß Dateisystem-Unterstützung hat. – Evert

+0

Ich habe dieses Problem in Linux php 7.1. Bitte überprüfen Sie den Link: https://bugs.php.net/bug.php?id=74958 – user3770797

0

Dies könnte mit der tschechischen helfen, es wird nicht mit CJK helfen (immer noch auf der Suche nach dem selbst). Buggy "Rationale": UTF-8 ist in Ordnung, solange es dem Windows-Zeichensatz zugeordnet werden kann.

PHP ist unangenehm klar dazu: «PHP nicht Unicode-Operationen bis PHP6 unterstützt»

scandir() und readdir() nicht unterstützt Unicode-Dateinamen

http://bugs.php.net/bug.php?id=34574

geschrieben im September 2005.

Sie könnten auch versuchen, die dos short name equivalent mit System ('dir/X') zu greifen, analysieren Sie die Ergebnisse für kurze und lange Namen und arbeiten von dort. Anzeige langer Namen, tatsächlich Zugriff (natürlich für stat, Zeitstempel und Datei öffnen) mit den kurzen Namen ...

Verwandte Themen