2010/01/12

.CFUserTextEncoding へは改行コードを付与すべきでない

MacOS X では、現在ユーザの利用しているテキスト言語環境を示す情報が、ホームティレクトリの .CFUserTextEncoding ファイルへ書き込まれます。

実際には、System Preferences の Languages & Text を変更し、再度 login することでシステムにより値が設定されるようで、例えばシステム言語を日本語へ設定した場合には、この値は 1:14 に、同じく英語では0:0、ドイツ語では0:3 などへ設定されます(値の意味に関しては、MacOS X 英語環境で Flash を日本語モードで使うをご参照ください)。

この際、設定値の行末へ改行コードは付与されません。よって、もし何らかの理由でこの値を自分自身で変更する場合にも、行末へ改行コードを付与しないよう、注意すべきです。

今回、私は行末へ改行コードを付与してしまったために、愛用させていただいているCarbon Emacsの言語環境が日本語にならず、はまってしまいました。

.CFUserTextEncoding は、環境変数 __CF_USER_TEXT_ENCODING の生成に使われます。具体的には、.CFUserTextEncodingファイルの値へUID値を付与し __CF_USER_TEXT_ENCODING を生成しているようです。

Carbon Emacs では、この __CF_USER_TEXT_ENCODING 環境変数を参照して稼働環境を切り替えます。具体的には、/Applications/Emacs.app/Contents/Resources/site-lisp/site-start.d/japanese-init.el 内に於いて、

(string-match ":1:14\\'" (getenv "__CF_USER_TEXT_ENCODING"))

の結果を判定し、切り替えています。

ここで string-match の regexp部は \' が指定されているため、文字列またはバッファ終端であることが期待されています。そのため、もし .CFUserTextEncoding ファイルの行末に改行コードが付与されている場合、この判定式に適合しなくなってしまうのです。

今回は Carbon Emacs で問題の生じる事象を発見しましたが、システムの自動生成では改行コードが付与されていない以上、他にも同様の判定方法を行っているソフトウェアも存在するかもしれません。

もし何らかの理由により、自分で設定する場合には、Terminal などから、

 % echo -n 1:14 > ~/.CFUserTextEncoding

のように、-n オプションを指定した echo コマンドを使用する、などの方法が安全だと思いました。

1年以上も前に自身が書いたエントリと同じ内容でハマるというのは、あまりに進歩がないなぁ、と改めてショックを受けた一日でした。

0 件のコメント:

コメントを投稿