我有一段看起来像这样的代码:
Dir.new(path).each do |entry|
puts entry
end
当我在列出的目录中有一个名为こんにちは世界.txt的文件时出现问题。 在Windows 7机器上,我得到输出:
???????.txt
从Google上搜索,在Windows上正确读取此文件名似乎是一项不可能完成的任务。有什么建议吗?
答案 0 :(得分:10)
我遇到了同样的问题&刚刚弄清楚如何在Windows中以UTF-8获取目录条目。以下对我有用(使用Ruby 1.9.2p136):
opts = {}
opts[:encoding] = "UTF-8"
entries = Dir.entries(path, opts)
entries.each do |entry|
# example
stat = File::stat(entry)
puts "Size: " + String(stat.size)
end
答案 1 :(得分:4)
你使用纯粹的ruby(1.8或1.9.1),因为它使用的是ANSI API的ANSI版本。
Ruby 1.9.2似乎支持Windows上的Unicode文件名。 This bug report以1.9.2为目标。根据{{3}} Ruby 1.9.2将于2010年7月底发布。
如果您确实需要它,可以尝试直接通过Win32API.new
或this announcement使用FindFirstFileW等。
答案 2 :(得分:0)
我的解决方案是使用Dir.glob
而不是Dir.entries。但它只适用于*参数。传递路径时它不起作用(c:/ dir / *)。在Windows 7上测试了1.9.2p290和1.9.3p0。
Windows上的unicode路径还有许多其他问题。它仍然是open issue。这些补丁目前针对的是Ruby 2.0,将于2013年发布rumored。