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。