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

Encoding problems with ruby while reading in command line arguments with 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 字符在命令行上指定文件?

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

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