【问题标题】:Encoding problems with ruby while reading in command line arguments with optparse使用 optparse 读取命令行参数时 ruby​​ 的编码问题
【发布时间】:2016-01-08 17:25:36
【问题描述】:

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

【问题讨论】:

    标签: ruby encoding optparse


    【解决方案1】:

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

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

    【讨论】:

    • 感谢您的快速回答 - 现在可以使用了!不过奇怪的是,ruby 假定了错误的编码......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-22
    • 1970-01-01
    • 1970-01-01
    • 2015-10-17
    相关资源
    最近更新 更多