我无法弄清楚将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
命令时,它尝试使用不同的文件名
答案 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
希望这可以帮助有类似问题的人。