2008-11-21 6 views
5

Chciałbym wygenerować listę plików w katalogu. Niektóre nazwy plików zawierają chińskie znaki.Rekursywna lista katalogów używająca Ruby z chińskimi znakami w nazwach plików

np: [试验] .Test.txt

używam następujący kod:

require 'find' 
dirs = ["TestDir"] 
for dir in dirs 
    Find.find(dir) do |path| 
    if FileTest.directory?(path) 
    else 
     p path 
    end 
    end 
end 

Uruchamianie skryptu tworzy listę plików, ale chińskie znaki są uciekł (zastąpiony następnie ukośniki według numerów). Używanie powyższej przykładowej nazwy pliku może spowodować:

"TestDir/[\ 312 \ 324 \ 321 \ 351] Test.txt" zamiast "TestDir/[试验] .Test.txt".

W jaki sposób można zmienić skrypt, aby wyświetlał chińskie znaki?

Odpowiedz

4

Ruby musi wiedzieć, że masz do czynienia z unikodem w kodzie. Ustaw odpowiednie kodowanie znaków za pomocą KCODE, jak poniżej:

$KCODE = 'utf-8' 

Myślę, że utf-8 jest wystarczająco dobry dla chińskich znaków.

1

Poniższy kod jest bardziej elegancki i nie wymaga "znalezienia". Tworzy listę plików (ale nie katalogów) w katalogu roboczym (lub katalogu, który umieścisz).

Dir.entries(Dir.pwd).each do |x| 
    p x.encode('UTF-8') unless FileTest.directory?(x) 
end 

i uzyskać rekurencyjną kopanie w dół o jeden poziom użycia:

Dir.glob('*/*').each do |x| 
    p x.encode('UTF-8') unless FileTest.directory?(x) 
end 

Jestem pewien, że istnieje sposób, aby zmusić go do przejść całą drogę w dół, ale Dir.glob('**/*') przejdzie przez cały plik system, jeśli dobrze pamiętam.