Rekursive Verzeichnisliste Rubin mit mit chinesischen Zeichen in Dateinamen
-
08-07-2019 - |
Frage
Ich möchte eine Liste von Dateien innerhalb eines Verzeichnisses erzeugen. Einige der Dateinamen enthalten chinesische Zeichen.
zB: [试验] .Test.txt
Ich bin mit dem folgenden Code:
require 'find'
dirs = ["TestDir"]
for dir in dirs
Find.find(dir) do |path|
if FileTest.directory?(path)
else
p path
end
end
end
Ausführen des Skripts erzeugt eine Liste von Dateien, aber die chinesischen Schriftzeichen entkommen sind (ersetzt mit Schrägstriche gefolgt von Ziffern). das Beispiel Dateinamen erzeugen würde oben ein:
"TestDir / [\ 312 \ 324 \ 321 \ 351] Test.txt" anstelle von "TestDir / [试验] .Test.txt".
Wie kann das Skript für die Ausgabe der chinesischen Schriftzeichen verändert werden?
Lösung
Rubin muss wissen, dass Sie in Ihrem Code mit Unicode handeln. Setzen Sie geeignete Zeichenkodierung mit KCODE, wie folgt:
$KCODE = 'utf-8'
Ich denke, utf-8 ist gut genug für chinesische Schriftzeichen.
Andere Tipps
Der folgende Code ist eleganter und erfordert keine ‚gefunden.‘ Es gibt eine Liste von Dateien (aber nicht Verzeichnisse) in welchen das Arbeitsverzeichnis (oder was auch immer Verzeichnis, das Sie setzen in).
Dir.entries(Dir.pwd).each do |x|
p x.encode('UTF-8') unless FileTest.directory?(x)
end
Und eine rekursive Graben eine Ebene nach unten Verwendung zu erhalten:
Dir.glob('*/*').each do |x|
p x.encode('UTF-8') unless FileTest.directory?(x)
end
Ich bin sicher, dass es eine Möglichkeit, es den ganzen Weg hinunter zu gehen zu bekommen, ist aber Dir.glob('**/*')
wird das gesamte Dateisystem durchlaufen, wenn ich mich recht erinnere.