我想不出正确的方法来编码一个 shell 命令以在 Windows 上从 Ruby 运行。以下脚本重现了该问题:
# encoding: utf-8
def test(word)
returned = `echo #{word}`.chomp
puts "#{word} == #{returned}"
raise "Cannot roundtrip #{word}" unless word == returned
end
test "good"
test "bÃd"
puts "Success"
# win7, cmd.exe font set to Lucinda Console, chcp 65001
# good == good
# bÃd == bÃd
这是 Ruby 中的错误,还是在将命令字符串传递给 cmd.exe 进程之前,我是否需要手动将命令字符串编码为特定编码?
更新:我想明确指出,问题不在于将输出读回 Ruby,而在于将命令发送到 shell。展示:
# encoding: utf-8
File.open("bbbÃd.txt", "w") do |f|
f.puts "nothing to see here"
end
filename = Dir.glob("bbb*.txt").first
command = "attrib #{filename}"
puts command.encoding
puts "#{filename} exists?: #{ File.exists?(filename) }"
system command
File.delete(filename)
#=>
# UTF-8
# bbbÃd.txt exists?: true
# File not found - bbbÃd.txt
您可以看到文件已正确创建,该File.exists?
方法确认 Ruby 可以看到它,但是当我尝试对其运行attrib
命令时,它尝试使用不同的文件名。