CFUserTextEncoding
現象
Mac OS X 10.5.4での話。
pbcopy、pbpasteをTerminalからUTF-8で使う方法をぐぐると、.bash_profileで
export __CF_USER_TEXT_ENCODING=${__CF_USER_TEXT_ENCODING/:*:/:0x08000100:/}
するとできると書いてある。私の環境では、これはうまく行かず、相変わらずpbcopyはShift JISしか受け付けてくれない。原因を調べてみると、どうやら~/.CFUserTextEncodingというファイルが存在すると、それに書いてある設定によってpbcopyやpbpasteが挙動を変えるようである。このファイルは最初
1:14
とだけ書かれた単なるテキストだった。そこで上記の.bash_profileの設定はそのままにして.CFUsetTextEncodingを削除したところ、確かにpbcopyがUTF-8を受け付けるようになった。またもちろん、pbcopyした日本語テキストでは
pbpaste | nkf --guess #=> UTF-8 (LF)
となる。ところが、GUIのアプリケーションでクリップボードにコピーした内容は、別のGUIアプリケーションに内容をペーストするときは正常だが、pbpasteに渡す時に2byte文字の情報が失われてしまうらしく、
pbpaste | nkf --guess #=> ASCII (LF)
などとなり、pbpasteすると2byteの部分は??に置換されてしまう。
そこで、
echo 0x08000100:14 > ~/.CFUserTextEncoding
としたところ、GUIアプリとpbpasteの間の日本語の受け渡しも正常になった。
結論
まとめると、
- pbcopy/pbpasteは、環境変数$__CF_USER_TEXT_ENCODINGよりも、~/.CFUserTextEncodingの中身を設定として優先するらしい
- 環境変数$__CF_USER_TEXT_ENCODINGをpbcopyは見てるけど、pbpasteはなんだか怪しくて、GUIアプリとpbpaste間の日本語の受け渡しがうまく行かないっぽい
したがって、pbcopy/pbpasteをUTF-8で使う時の処方箋は、
echo 0x08000100:14 > ~/.CFUserTextEncoding #意味:コロンの前の数字はエンコーディングでUTF-8を表し、後ろの数字が使用している言語で日本語を表す
の方がよいのではないかと思う。ただし、自分の環境以外では検証を行なっていないのであしからず。
追記(不具合について)
以上のことを行なったところ、一部のアプリケーションが起動しなくなるなどの問題が発生したため、私は現在元に戻している。
試す場合はat your onw riskでよろしくお願いしたい。
うまく行く方法ないものかねー。