去年 (2008 年) 12 月 10 日,Cygwin 1.7 の公開テストの開始が
Cygwin のメーリングリストでアナウンスされました。
インストールするには,そのアナウンスで説明されているように
http://cygwin.com/setup-1.7.exe を使います。
setup-1.7.exe の使い方そのものは従来の setup.exe と同じです。 実行すると Cygwin 1.5 のかわりに Cygwin-1.7 とそれに随伴するパッケージがダウンロードされ,インストールされます。
アナウンスで警告されているように,デフォルトでは既存の Cygwin 1.5 環境をアップグレード,つまり上書きします。
もしも既存環境をそのままにしたいときは,setup-1.7.exe でインストールするとき,インストール先を,例えば,
C:/cygwin から C:/cygwin-1.7 に変更します。
ちなみにここで以下,記述している環境は,破壊しても惜しくない実験環境をデフォルトどおりにアップグレードしたものです。
ダウンロードされたパッケージは,従来とは別の release-2 フォルダに保存されます。
インストール後,Cygwin を起動して cat /proc/version でバージョンを確かめると
確かに 1.7.0 になっています。
従来の Cygwin 1.5 および前回の UTF-8 Cygwin で作成した日本語ファイルへのシンボリック・リンクもそのまま有効です。
「ソソソ」のようないわゆる SJIS ダメ文字入りのフォルダを mkdir してみると成功します。
しかし,rmdir や ls ではこのフォルダを正しく扱えません。
前述の Cygwin 1.7 のアナウンス記事では簡単に,そこからリンクされている http://cygwin.com/1.7/cygwin-ug-net.html では詳細に Cygwin 1.7 の機能が記述されています。
それによれば,Cygwin 1.7 は UTF-8 を標準でサポートしています。
将来的には正攻法で Unix の locale 機構と統合する模様ですが,さしあたり現時点での実装で,この機能を有効にするには
Cygwin の起動前に環境変数 CYGWIN に codepage:utf8 を指定します。
さしあたり起動用のバッチファイル Cygwin.bat を書き換えてみます。
01:~$ cd / 01:/$ cat Cygwin.bat @echo off C: chdir C:\cygwin\bin bash --login -i 01:/$ meadow Cygwin.bat 01:/$ diff Cygwin.bat~ Cygwin.bat 2a3,4 > set CYGWIN=codepage:utf8 > 11:/$ cat Cygwin.bat @echo off set CYGWIN=codepage:utf8 C: chdir C:\cygwin\bin bash --login -i 01:/$
書き換えた後,Cygwin を起動しなおします。
UTF-8 Cygwin と異なり,現在の Cygwin 1.7 (cygwin-1.7.0-37) の UTF-8 モードは,互換性にいろいろと難があります。
この例で示しているホームディレクトリでは,日本語名のフォルダ「デスクトップ」へシンボリック・リンク Desktop をはっています。
従来の Cygwin 1.5 では,「デスクトップ」という名称を,シンボリックを実装しているファイルの内部に SJIS で格納します。 UTF-8 Cygwin でも,互換性維持のため,名称を SJIS で (正確には各国の Windows それぞれのコードページで) 格納します。
しかし,残念なことに,今の Cygwin 1.7 の UTF-8 モードには,そういった配慮はありません。
SJIS で格納されている「デスクトップ」という文字列を UTF-8
で読み出そうとして,文字化けし,フォルダへのアクセスに失敗します。
しかたありませんから,今までのシンボリック・リンク Desktop を消し,新しく作り直します。 うまくシンボリック・リンクが消えないときは,いったん Cygwin を終了させ,Windows のエクスプローラから消します。
01:~$ ln -s profile/デスクトップ Desktop
今までの Cygwin (UTF-8 Cygwin を含む) のシンボリック・リンクの実装と異なり, Cygwin 1.7 で作ったシンボリック・リンクは,エクスプローラのショートカットとして利用することはできません。
もちろん,Cygwin から使う限りは問題ありません。
このモードでは,さきほど mkdir できたものの rmdir
できなかった 「ソソソ」フォルダも問題なく消すことができます。
このモードでのコンソール入出力は,Cygwin を経由する限り,UTF-8 Cygwin
と同じく,UTF-8 扱いになります。UTF-8 で書かれたテキスト・ファイルを cat
で表示することや,UTF-8 文字列を普段の MS-IME でコマンド行から入力することができます。
今回の例でコマンド行に rmdir ソソソ を入力したとき,MS-IME の漢字変換で入力した「ソソソ」が
rmdir に UTF-8 文字列として渡されていることに注意してください。
しかし,再び残念なことに,UTF-8 Cygwin と異なり,出力しようとする文字列が UTF-8 文字列として解釈できないとき,従来のコードページとして解釈し直す機能までは実装されていません。
したがって,Cygwin 1.7 の UTF-8 モードでは,SJIS
で書かれたテキストファイルを表示するとき,陽にUTF-8 に変換する必要があります。
この制限事項が深刻なのは,"国際化" されたコマンドに対してです。
環境変数を設定して,この種のコマンドが日本語メッセージを表示するようにしたとき,現状では文字化けします。
SJIS で表示しようとするからです。
今のところ,locale の文字エンコーディング指定は無効ですから,
環境変数変数値を ja ではなく ja_JP.UTF-8 にしても文字化けは直りません。
もしもコマンドが cygwin1.dll を経由せずに W 系ではなく A 系の Win32 API を直接叩いているときは,その API 由来のメッセージ文字列についても同じ問題があります。 (例: mkgroup)
この問題は本質的な矛盾ではなく,個別のライブラリやコマンドの実装で解決可能なことですが,少なくとも
現時点では不便をかこつことになります。
以上述べたように難がないわけではありませんが,Cygwin が標準機能として UTF-8 を扱えること,とりわけ日本語 Windows で作成可能なファイル名,フォルダ名を Cygwin 上の Unix コマンドから問題なく扱えることは,間違いなく大きな前進です。 加えて,今までの Cygwin (UTF-8 Cygwin を含む) と異なり,Cygwin 1.7 は,内部的に Windows が扱える限りの長いパス名を扱えるようになっています。 状況によっては,これは決定的な利点になります。