如何在Windows上从Ruby运行非ASCII / Unicode Shell命令?

Jos*_*gan 5 ruby unicode character-encoding

我无法弄清楚编码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
Run Code Online (Sandbox Code Playgroud)

这是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
Run Code Online (Sandbox Code Playgroud)

您可以看到该文件已正确创建,该File.exists?方法确认Ruby可以看到它,但是当我尝试attrib在其上运行命令时,它尝试使用其他文件名。

Lit*_*mus 2

LC_CTYPE尝试像这样设置环境变量:

 LC_CTYPE=en_US.UTF-8
Run Code Online (Sandbox Code Playgroud)

在命令 shell 或 Ruby 脚本中全局设置:

ENV['LC_CTYPE']='en_US.UTF-8' 
Run Code Online (Sandbox Code Playgroud)