6

我想不出正确的方法来编码一个 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命令时,它尝试使用不同的文件名。

4

2 回答 2

2

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

 LC_CTYPE=en_US.UTF-8

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

ENV['LC_CTYPE']='en_US.UTF-8' 
于 2013-10-22T15:37:46.360 回答
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

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

于 2019-06-29T17:07:25.473 回答