如何在Ruby中复制文件名中带有Unicode字符的文件?

时间:2012-01-20 09:34:48

标签: ruby unicode utf-8 filesystems

我无法在Windows 7上从Ruby 1.9.2p290复制名称中包含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

2 个答案:

答案 0 :(得分:0)

不是一个真正的解决方案,而是作为一种解决方法,给出:

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

你有什么理由不能这样做:

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

答案 1 :(得分:0)

已经有一段时间了,但是我一直在研究同样的问题,而且几乎是怎么做的。

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

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