使用optparse读取命令行参数时使用ruby编码问题

时间:2016-01-07 11:51:15

标签: ruby encoding optparse

我正在用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字符在命令行上指定文件?

1 个答案:

答案 0 :(得分:0)

在打开文件之前添加zip_file_name.force_encoding(Encoding::Windows_1252)解决了问题(在西欧Windows上)。

显然,CP850文件名编码是Ruby的错误假设。在我的Windows系统上,似乎文件名是在Windows_1252(Latin1或ISO 8859-1的自定义版本)中编码的。