我正在用ruby编写一个小程序,它实际上改变了zip文件中的一些文件。 zip文件在命令行中指定为参数,并通过OptionParser进行解释。
问题是,在指定包含非ascii字符的文件时,无法打开该文件,说无法找到该文件。在Windows下使用cmd.exe
会出现此问题。
这是一个最小的例子:
# example.rb
require "zip"
require "optparse"
zip_file_name = String.new
# read and interprete command line arguments:
OptionParser.new do |opts|
opts.on("-f", "--file FILE", String, "The zip-file, which will be modified") do |f|
zip_file_name = f
end
end.parse!
# Open the zip file:
Zip::File.open(zip_file_name) do |zipfile|
end
如果您创建一个zip文件test.zip
并运行example.rb -f test.zip
一切正常(它确实完成没有错误)。使用zip文件täst.zip
执行相同操作会给我一个错误。我试过zip_file_name.encode!(Encoding::UTF_8)
,但这并没有解决问题。
这似乎是一个编码问题(zip_file_name的编码是cp850),但转码似乎无法正常工作。
所以我的问题是:如何更改我的程序以允许非ascii字符在命令行上指定文件?
答案 0 :(得分:0)
在打开文件之前添加zip_file_name.force_encoding(Encoding::Windows_1252)
解决了问题(在西欧Windows上)。
显然,CP850文件名编码是Ruby的错误假设。在我的Windows系统上,似乎文件名是在Windows_1252(Latin1或ISO 8859-1的自定义版本)中编码的。