Windows 上 Ruby 中的 Unicode 文件名
我有一段代码,如下所示:
Dir.new(path).each do |entry|
puts entry
end
当我列出的目录中有一个名为 こんにちは世界.txt 的文件时,问题就出现了。 在 Windows 7 机器上,我得到输出:
???????.txt
通过谷歌搜索,在 Windows 上正确读取此文件名似乎是一项不可能的任务。有什么建议吗?
I have a piece of code that looks like this:
Dir.new(path).each do |entry|
puts entry
end
The problem comes when I have a file named こんにちは世界.txt in the directory that I list.
On a Windows 7 machine I get the output:
???????.txt
From googling around, properly reading this filename on windows seems to be an impossible task. Any suggestions?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
我有同样的问题&刚刚弄清楚如何在 Windows 中获取 UTF-8 目录的条目。以下内容对我有用(使用 Ruby 1.9.2p136):
I had the same problem & just figured out how to get the entries of a directory in UTF-8 in Windows. The following worked for me (using Ruby 1.9.2p136):
您无法使用纯 ruby(1.8 或 1.9.1),因为它使用 ANSI 版本的 Windows API。
Ruby 1.9.2 似乎将支持 Windows 上的 Unicode 文件名。 此错误报告以 1.9.2 为目标。根据此公告,Ruby 1.9.2将于2010年7月下旬发布。
如果您确实需要更早,您可以尝试使用 FindFirstFileW 等。直接通过
Win32API.new
或win32-api
。You're out of luck with pure ruby (either 1.8 or 1.9.1) since it uses the ANSI versions of the Windows API.
It seems like Ruby 1.9.2 will support Unicode filenames on Windows. This bug report has 1.9.2 as target. According to this announcement Ruby 1.9.2 will be released at the end of July 2010.
If you really need it earlier you could try to use FindFirstFileW etc. directly via
Win32API.new
orwin32-api
.我的解决方案是使用 Dir.glob 而不是 Dir.entries。但它仅适用于 * 参数。当传递路径 (c:/dir/*) 时它不起作用。在 Windows 7 上的 1.9.2p290 和 1.9.3p0 中进行了测试。Windows
上的 unicode 路径还存在许多其他问题。它仍然是一个悬而未决的问题。这些补丁目前针对 Ruby 2.0,即 传闻将于 2013 年发布。
My solution was to use
Dir.glob
instead of Dir.entries. But it only works with * parameter. It does not work when passing a path (c:/dir/*). Tested in 1.9.2p290 and 1.9.3p0 on Windows 7.There are many other issues with unicode paths on Windows. It is still an open issue. The patches are currently targeted at Ruby 2.0, which is rumored to be released in 2013.