使用Ruby进行递归目录列表,处理包含中文字符的文件名

5
我希望生成一个目录中的文件列表。其中一些文件名包含中文字符。
例如:[试验].Test.txt
我正在使用以下代码:
require 'find'
dirs = ["TestDir"]
for dir in dirs
    Find.find(dir) do |path|
    if FileTest.directory?(path)
    else
        p path
    end
    end
end

运行脚本会生成文件列表,但中文字符被转义(替换为反斜杠后跟数字)。使用上面的示例文件名将产生:"TestDir/[\312\324\321\351]Test.txt"而不是"TestDir/[试验].Test.txt"。如何修改脚本以输出中文字符?
2个回答

4

Ruby需要知道你在代码中处理的是unicode字符集。使用KCODE设置适当的字符编码,如下所示:

$KCODE = 'utf-8'

我认为utf-8对于中文字符已经足够好了。


1
以下代码更加优雅,不需要使用“find”。它会在当前工作目录(或您指定的任何目录)中生成一个文件列表(但不包括目录)。
Dir.entries(Dir.pwd).each do |x|
  p x.encode('UTF-8') unless FileTest.directory?(x)  
end 

要进行递归向下一级的挖掘,请使用:

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

我相信有一种方法可以让它完全下降,但是如果我没记错的话,Dir.glob('**/*')会遍历整个文件系统。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接