それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

cygwin を使えばWindowsファイル名がUTF-8になる。

Cygwin使い始めて約一ヶ月たちました。毎日使うツールになりました。

文字コードUTF-8で統一して使っています。UTF-8統一すると、rsync文字化けや scp 文字化け、そしてSSHコマンドで文字化けしなくなって、WindowsなのにMacのターミナルを使っている快適さです。

cygwinを使うとファイル名がUTF-8になるのでとても便利になりました。

utf8で使うメリット

Linuxとヤリとりで文字化けしない

  1. rsync,scp 文字化けしない
  2. hg,git で文字化けしない
  3. ssh コマンドでそのままログインできる
utf-8のデメリット
  1. pingが文字化けする
  2. tracertが化ける

Windowsコマンドが化けるのはコマンドラッパーをrubyで書くことで解決しました。

cygwin + Windows でファイル名をUTF-8にする方法

  1. $LANGを設定
  2. bashrcを設定
  3. mintty を設定

$LANGを設定しましました

export LANG=ja_JP.UTF-8 


これでファイル名がUTF-8になりました。

LANGをBashrcに書きました。

basrcに書いたらいつでもUTF-8です。

MinttyをUTF-8

MinttyをUTF-8にすると楽です。

これでコマンドプロンプトから卒業して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のLinuxUTF-8で統一できた。