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在其上运行命令时,它尝试使用其他文件名。
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)
| 归档时间: |
|
| 查看次数: |
935 次 |
| 最近记录: |