我无法在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_external
和default_internal
编码设置为'utf-8'无济于事。
如何从Ruby复制这些文件?
更新
我找到了解决方案。如果我使用Dir.glob
或Dir[]
而不是Dir.entries,它会起作用。文件名现在以utf-8编码返回,可以复制。
更新#2
我的Dir.glob
解决方案似乎非常有限。它仅适用于“*”参数:
Dir.glob("*") # <--- Shows Unicode names correctly
Dir.glob("c:/test/*") # <--- Does not work for Unicode names
答案 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)