Frage

Unter OS-X (PHP5.2.11) Ich habe eine Datei: siësta.doc (und tausend andere mit Unicode-Dateinamen), und ich mag zu einem Web-Verbrauch Format der Dateinamen konvertieren (a-zA-Z0-9 .). Wenn ich den Dateinamen oben hart codieren ich die richtige Umwandlung tun können:

<?php
  $file = 'siësta.doc';
  echo preg_replace("/[^a-zA-Z0-9.]/u", '_', $file);
  // Output: si_sta.doc
?>

Aber wenn ich die Dateinamen mit scandir lesen, habe ich seltsame Umbauten bekommt:

<?php
  $files = scandir(DIRNAME);
  foreach ($files as $file) {
    echo preg_replace("/[^a-zA-Z0-9.]/u", '_', $file);
    // Output for the file above: sie_sta.doc
  }
?>

Ich habe versucht, die Codierung zu erfassen, stellen Sie die Codierung, wandeln es mit iconv Funktionen. Ich versuchte, die mb_ Funktionen auch. Aber es war nur noch schlimmer. Was habe ich falsch gemacht?

Vielen Dank im Voraus

War es hilfreich?

Lösung

Interessant. Nach ein bisschen recherché habe ich festgestellt, dass OSX speichert Dateinamen als "zerlegt Unicode" (siehe http://developer.apple.com/mac/library/qa/qa2001/qa1173.html ). Das heißt, "ë" als "e" dargestellt + diaresis Symbol (0xcc88).

Andere Tipps

Sie haben versucht utf8_encode? (Arbeiten unter Windows mindestens)

<?php
  $files = scandir(DIRNAME);
  foreach ($files as $file) {
    echo preg_replace("/[^a-zA-Z0-9.]/u", '_', utf8_encode($file));
    // Output for the file above: sie_sta.doc
  }
?>

Das Problem ist die Kommunikation zwischen den Fenstern und PHP. Es ist nicht möglich, Unicode-Dateinamen zu bekommen, weil sie auf Nicht-Unicode-Windows-Anwendung Sprache ab.

Die beste Lösung ist es, einen Verzeichnis-Befehl auszuführen und Informationen verarbeitet werden, aber man muss es so durch ein cmd tun, und immer die Fenster Kurznamen:

chcp 65001
dir /x c:\test\ > myinfo.txt

Es gibt:

 El volumen de la unidad C es Windows8_OS
 El número de serie del volumen es: 14A3-025F

 Directorio de C:\test

22/12/2015  22:11    <DIR>                       .
22/12/2015  22:11    <DIR>                       ..
22/12/2015  22:12                 0              a.txt
22/12/2015  22:10    <DIR>                       English
22/12/2015  22:10    <DIR>          ESPAOL~1     Español
22/12/2015  22:11    <DIR>          8311~1       ру́сский язы́к
22/12/2015  22:10    <DIR>          _0B41~1      عربي ,عربى
22/12/2015  22:10    <DIR>          8F4C~1       北方話
               1 archivos              0 bytes
               7 dirs  839.672.786.944 bytes libres

Dann können Sie myinfo.txt lesen Sie die Verbindung zwischen ursprünglichen Namen und Fenster kurzen Namen zu bekommen.

Einige PHP-Funktionen funktionieren gut mit kurzen Namen und Sie können bauen und Array, als ob Sie es angezeigt werden muss:

$array['short_name']= $original_name;

Zum Beispiel: is_dir, is_file funktioniert . Allerdings scandir oder is_readable nicht mit kurzen Namen zu . Die Lösung, um diese Funktionen zu verwenden, ist rekursiv ein Verzeichnis-Befehl erneut ausführen.

Um Informationen aus TXT-Datei zu erhalten, können Sie einen regulären Ausdruck oder substr, verwenden Sie die ersten fünf Zeilen und die letzten beiden zu verwerfen. Zum Beispiel:

for($k=6;$k<(count($array)-2);$k++) ...
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top