如何在Ruby中复制文件名包含Unicode字符的文件?

5

我无法从Ruby 1.9.2p290在Windows 7上复制具有Unicode字符命名的文件。

例如,在一个目录中有两个文件:

file
ハリー・ポッターと秘密の部屋

以下是代码:

(如果您看不到第二个名称中的日语字符)

> entries = Dir.entries(path) - %w{ . .. }
> entries[0]
=> "file"
> entries[1]
=> "???????????????" # <--- what?

> File.file? entries[0]
=> true
> File.file? entries[1]
=> false   # <---  !!! Ruby can not see it and will not copy

> entries[1].encoding.name
=> "Windows-1251"
> Encoding.find('filesystem').name
=> "Windows-1251"

你看到我的 Ruby 文件系统编码是 "windows-1251",它是 8 位的,无法处理日语。将 default_externaldefault_internal 编码设置为 'utf-8' 也没有帮助。

我该如何从 Ruby 复制这些文件?

更新

我找到了一个解决方案。如果我使用 Dir.globDir[] 而不是 Dir.entries,则会返回以 utf-8 编码的文件名,可以进行复制。

更新 #2

我的 Dir.glob 解决方案似乎相当有限。它仅适用于 "*" 参数:

Dir.glob("*") # <--- Shows Unicode names correctly
Dir.glob("c:/test/*") # <--- Does not work for Unicode names

嗯,Windows 7没有可能重现您的问题。看一下这篇帖子,也许它可以在某种程度上有所帮助:http://www.ruby-forum.com/topic/1593850 - Aliaksei Kliuchnikau
1
你尝试过在代码文件顶部添加 #encoding: utf-8 或者以 irb -Ku 的方式运行 irb 吗? - Frost
是的,我做了,但没有帮助。 - Evgenii
2个回答

1

虽然不是真正的解决方案,但作为一种变通方法,考虑到:

Dir.glob("*") # <--- Shows Unicode names correctly
Dir.glob("c:/test/*") # <--- Does not work for Unicode names

你有任何原因做不到这个吗:

Dir.chdir("c:/test/")
Dir.glob("*")

?


0

已经有一段时间了,但我一直在研究同样的问题,但如何解决它并不明显。

事实证明,在调用Ruby >= 2.1中的Dir#entries时,您可以指定编码。

Dir.entries(path, encoding: Encoding::UTF_8)

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