cygwin の putclip/getclip の文字化け対策

cygwin には Windowsクリップボードを操作する putclip/getclip というコマンドがあるが、日本語に難がある。

$ echo -n こんにちは | /bin/putclip

とやると、他のアプリケーションに貼り付けたときに文字化けする。

縺薙s縺ォ縺。繧・

ただし、この状態で getclip すると元通り。

$ /bin/getclip
こんにちわ

理由は知らないが SHIFT_JIS に変換してやれば、他のアプリケーションに貼り付けても文字化けしないみたい。

$ echo -n こんにちわ | nkf -W -s | /bin/putclip
$ /bin/getclip | nkf -S -w
こんにちわ

でも他のアプリケーションからコピーした文字列は getclip で文字化けする。

$ /bin/getclip
?????

よくわからん。ちなみにうちの環境は英語版 Windows 7 なので、OS の文字コードSHIFT_JIS ではないはず。

そこで

/dev/clipboard を使えばいいとわかった。

$ echo -n こんにちわ > /dev/clipboard
$ cat /dev/clipboard
こんにちわ

これだったら他のアプリケーションに張ろうが他からコピーしようが文字化けしないっぽい。というわけで、こんなシェルスクリプトを書いてみた。

  • putclip.sh
#!/bin/sh

IFS='
'
str=''
delim=''

while read -r line; do
  str="$str$delim$line"
  delim='_D_e_L_i_M_i_T_e_R_'
done

# copy as windows format (\n becomes CRLF)
echo -n $str | sed s/$delim/\\n/g > /dev/clipboard

IFS ってのはシェルスクリプトの区切りのためのものらしい。これをやらないと read で行頭行末のスペースがどうのこうの。参考→http://d.hatena.ne.jp/n9d/20090313/1236912316

↑だとおかしいときがあるので Ruby にした。

#!/bin/ruby

open('/dev/clipboard', 'w') {|f|
  f.print($stdin.read.gsub("\r?\n", "\r\n"))
}
  • getclip.sh
#!/bin/sh

cat /dev/clipboard | tr -d '\r'

これを putclip/getclip という名前で $HOME/bin/ に置いて PATH=$HOME/bin:$PATH したら OK。