如何从Windows上的Ruby运行非ASCII / Unicode shell命令?

时间:2013-10-22 15:30:30

标签: 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

这是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命令时,它尝试使用不同的文件名

2 个答案:

答案 0 :(得分:1)

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

 LC_CTYPE=en_US.UTF-8

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

ENV['LC_CTYPE']='en_US.UTF-8' 

答案 1 :(得分:0)

在Windows中使用拖放操作时,我遇到了同样的问题。 当我删除名称为Unicode字符的文件时,Unicode字符被问号代替。 尝试对所有内容进行编码,更改drophandler等。 唯一有效的方法是创建一个包含以下内容的批处理文件。

ruby.exe -Eutf-8 C:\Users\user\myscript.rb %*

批处理文件确实正确接收了unicode字符,就像您看到的一样,首先执行echo %*,然后执行pause

我需要添加-Eutf-8参数,以使文件名在脚本本身中以UTF-8的形式出现,但脚本中的以下行不够用

#encoding: UTF-8
Encoding.default_external = Encoding::UTF_8
Encoding.default_internal = Encoding::UTF_8

希望这可以帮助有类似问题的人。