Encoding Problem mit preg_replace () und scandir ()
-
20-09-2019 - |
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
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++) ...