Cygwinの日本語対応

Cygwin 1.7は国際化されているので、何もしなくてもコマンドラインで日本語の入力や編集が可能である。名前が日本語のファイルやディレクトリの作成や編集も可能だ。「ソ」や「表」といったShift_JISで2バイト目に\が入る名前も平気である。
ロケールはデフォルトでC.UTF-8に設定される。このC.UTF-8には一つ問題がある。ギリシャ文字などの文字幅が半角扱いになってしまうため、全角扱いの日本語では行編集がうまくいかくなる。

これを避けるには、ロケールをja_JP.UTF-8に変更する必要がある。ロケールを変更するときは、Cygwin.batでset LANG=ja_JP.UTF-8とする。この場合は.bashrcでexport LANG=ja_JP.UTF-8としてもよい。

逆にja_JP.UTF-8としたときに、ギリシャ文字などを全角扱いにされては困る場合には、ロケールモディファイアcjknarrowを使って、ja_JP.UTF-8@cjknarrowとする。

ロケールをja_JP.UTF-8に設定すると、メッセージカタログが存在していれば、アプリケーションのメッセージが日本語で表示される。インストールされているメッセージカタログにはEUC-JPとUTF-8が混在しているが、gettextでUTF-8に変換されるので気にする必要はない。「日本語メッセージの文字化けに対応する」に書いてある内容は古いので参考にしてはいけない。

日本語を含むテキストファイルを読むときにはlessの代わりにlvを使えばよい。テキストファイルの文字コードShift_JISならUTF-8に変換して表示してくれる。

エンコーディングとしてUTF-8ではなくShift_JISを使いたい場合には、ロケールをja_JP.SJISに設定すればよい。この場合は.bashrcではなく、Cygwin.batで設定する必要がある。CygwinではShift_JISがCP932を意味する*1ので一応注意してほしい。

Cygwin 1.7.5ではロケールがja_JP.{UTF-8,SJIS}のときにdateコマンドを実行すると「2010年 6 13日 日曜日 02:05:38」と「月」が表示されないバグがある。これはすでに直してあるので、Cygwin 1.7.6以降では正しく表示されるようになる。

アプリケーションのメッセージや日付を日本語で表示したくない場合には、環境変数LANGではなくLC_CTYPEをja_JP.UTF-8かja_JP.SJISに設定するとよい。

*1:nl_langinfo(CODESET)が"CP932"を返す。