Ruby中Windows上的Unicode文件名

时间:2010-04-24 04:59:40

标签: ruby unicode windows-7 internationalization

我有一段看起来像这样的代码:

Dir.new(path).each do |entry|
    puts entry
end

当我在列出的目录中有一个名为こんにちは世界.txt的文件时出现问题。 在Windows 7机器上,我得到输出:

???????.txt

从Google上搜索,在Windows上正确读取此文件名似乎是一项不可能完成的任务。有什么建议吗?

3 个答案:

答案 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.newthis 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