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でよろしくお願いしたい。

うまく行く方法ないものかねー。