Cygwin使い始めて約一ヶ月たちました。毎日使うツールになりました。
文字コードをUTF-8で統一して使っています。UTF-8統一すると、rsync文字化けや scp 文字化け、そしてSSHコマンドで文字化けしなくなって、WindowsなのにMacのターミナルを使っている快適さです。
コマンドが文字化けする
だけどping.exeやtracert.exeが化けます。Windows標準のコマンドがSJISで出力して化けます
nkfで文字化けを処理する。
ping 192.168.2.1 | nkf -w
しかし、Pingはリアルタイム出力なので出力が終わってから変換をするとつらかった
/usr/local/bin/ping
#!/usr/bin/env ruby require "kconv" IO.foreach("|ping.exe #{$*.join(' ')}"){|line|puts line.kconv(out_kcode,Kconv::SJIS)}
このように、各行毎に出力すればよかった。
しかし、標準エラーは変換されなかった。そこでOpen3を使うことにした。
10 require 'open3' 11 Open3.popen3("where #{$*.join}"){|stdin,stdout,stderr| 12 stdin.close 13 stdout.each_line{|line| 14 line = line.toutf8.gsub("\\", "/") 15 puts `cygpath -u #{line}` 16 } 17 stderr.each_line{|line| 18 line = line.toutf8.gsub("\\", "/") 19 puts `cygpath -u #{line}` 20 } 21 22 }
コレで、標準エラー・標準入力もUTF-8でやりとりできて、WindowsのLinuxもUTF-8で統一できた。