6

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 に読み戻すことではなく、純粋にコマンドをシェルに送信することであることを明確にしたいと思います。デモンストレーションするには:

# 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

これをコマンド シェルまたは Ruby スクリプト内でグローバルに設定します。

ENV['LC_CTYPE']='en_US.UTF-8' 
于 2013-10-22T15:37:46.360 に答える