目次へ戻る §20へ戻る §22へ進む

21. Cygwin 1.7 と UTF-8

2009/1/16 (鈴)

21.1 Cygwin 1.7 公開テストの開始

去年 (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 フォルダに保存されます。

21.2 Cygwin 1.7 の起動と問題点

インストール後,Cygwin を起動して cat /proc/version でバージョンを確かめると 確かに 1.7.0 になっています。

従来の Cygwin 1.5 および前回の UTF-8 Cygwin で作成した日本語ファイルへのシンボリック・リンクもそのまま有効です。

「ソソソ」のようないわゆる SJIS ダメ文字入りのフォルダを mkdir してみると成功します。

しかし,rmdirls ではこのフォルダを正しく扱えません。

21.3 set CYGWIN=codepage:utf8

前述の Cygwin 1.7 のアナウンス記事では簡単に,そこからリンクされている http://cygwin.com/1.7/cygwin-ug-net.html では詳細に Cygwin 1.7 の機能が記述されています。

それによれば,Cygwin 1.7 は UTF-8 を標準でサポートしています。 将来的には正攻法で Unix の locale 機構と統合する模様ですが,さしあたり現時点での実装で,この機能を有効にするには Cygwin の起動前に環境変数 CYGWINcodepage: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 を起動しなおします。

21.4 cygwin-1.7.0-37 の UTF-8 モードの問題点

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)

この問題は本質的な矛盾ではなく,個別のライブラリやコマンドの実装で解決可能なことですが,少なくとも 現時点では不便をかこつことになります。

21.5 おわりに

以上述べたように難がないわけではありませんが,Cygwin が標準機能として UTF-8 を扱えること,とりわけ日本語 Windows で作成可能なファイル名,フォルダ名を Cygwin 上の Unix コマンドから問題なく扱えることは,間違いなく大きな前進です。 加えて,今までの Cygwin (UTF-8 Cygwin を含む) と異なり,Cygwin 1.7 は,内部的に Windows が扱える限りの長いパス名を扱えるようになっています。 状況によっては,これは決定的な利点になります。

目次へ戻る §20へ戻る §22へ進む

Copyright (c) 2009 Oki Software Co., Ltd.