ホーム ダウンロード 使用法 内部実装

UTF-8 Cygwin - ダウンロード

2006/3/31 - 2009/4/24 (鈴)

Cygwin 本体

2008/11/18: Cygwin 1.5.25-15 改訂対応版

Cygwin 本体 cygwin-1.5.25-15-src.tar.bz2 に対する差分ソースファイルと, 便宜のためのコンパイル済みバイナリを md5sum 値とともに示します。

初期の 2006/3/31 版 (Cygwin 1.5.19-4 用) と比べ,2006/8/9 版 (Cygwin 1.5.21-2 用) 以降 (本バージョンを含む) では下記の点を改良しています。

  1. コンソール出力で,従来のコードページ (日本では Shift JIS) の文字列を UTF-8 と誤認しにくくしました。 与えられたバイト列全体から UTF-8 かどうかを判定するようにしましたから, Shift JIS の「ファイル」も正しく出力します (Shift JIS 互換変換の制限事項参照)。
  2. Unicode の合成文字の変換対象として, 日本のひらがな/カタカナの濁音/半濁音に加えて, Latin-1, Latin-2, ラテン語 (長音符号付き) およびエスペラントのアルファベットを加えました。 西欧と中欧のほとんどの国語と共通語をカバーしています。 tar アーカイブ内のファイル名やフォルダ名にこれらの文字を使っても, Mac OS X と相互に受け渡しできます。 (Mac OS X との相互運用性参照)。

さらに 2008/3/11 版以降 (本バージョンを含む) では下記の改良をしています。

  1. Unicode のサロゲートペアに対応しました。 ひとまとまりの文字列を一括で UTF-8 変換/逆変換する限り,サロゲートペアの処理は Windows API 内部で自動的に行われますから,ここでの対応は個々のバイト・データを扱う コンソール入出力 だけで十分です。 差分ソースファイルで win-sup/cygwin/fhandler_console.cc に関係する部分のうち surrogate という単語を含む箇所がこれに該当します。

ただし,今のところ Windows Vista のコンソールが,サロゲートペアで表現される追加漢字面の表示に対応していませんから, 実際にコマンド行でそれらの漢字を見ることはできません。 もっとも,これは表示の問題だけで,コンソール上の論理的なデータそのものは正当ですから, メモ帳とのあいだでコピー&ペーストしたり,作成したファイル名をエクスプローラで確認すると, 正しくそれらの漢字を扱えていることが確認できます。

本バージョン (2008/11/18 版) では2箇所変更しました。

  1. 現行の binutils でセルフコンパイルできるように .gnu_debuglink の参照を無くしました。 そうしなければ,make 時に ../../.././winsup/cygwin/cygwin.sc:143: undefined section `.gnu_debuglink' referenced in expression というエラーが出て終わります。 __cygwin_debug_size はどこからも参照されていません。
    01:~/cygwin-1.5.25-15/winsup/cygwin$ diff cygwin.sc~ cygwin.sc
    114c114
    <   __cygwin_debug_size = SIZEOF(.gnu_debuglink);
    ---
    >   /* __cygwin_debug_size = SIZEOF(.gnu_debuglink); */
    11:~/cygwin-1.5.25-15/winsup/cygwin$
    
  2. コンソール出力に失敗したときでも,プログラムがクラッシュしないようにしました。
    01:~/cygwin-1.5.25-15/winsup/cygwin$ diff -c fhandler_console.cc~ fhandler_console.cc
    *** fhandler_console.cc~        Tue Nov 18 13:23:49 2008
    --- fhandler_console.cc Tue Nov 18 14:43:40 2008
    ***************
    *** 1643,1648 ****
    --- 1643,1650 ----
                          MultiByteToWideChar (CP_UTF8, 0, buf, offset, wbuf, r);
                          insert_spaces (mock_wswidth (wbuf, r));
                          r = WriteConsoleW (oh, wbuf, r, &dummy, 0);
    +                     if (r == 0)
    +                       break;
                          done = WideCharToMultiByte (CP_UTF8, 0, wbuf, dummy,
                                                      0, 0, 0, 0);
                        }
    11:~/cygwin-1.5.25-15/winsup/cygwin$
    

    ここでは Unicode 文字列を WriteConsoleW で出力し,実際に出力された文字数を dummy に得ています。それを WideCharToMultiByte へ渡すことで UTF-8 文字列でのバイト数を数えているわけですが,今までは WriteConsoleW の戻り値を検査していなかったため,エラー時に dummy が初期化されないまま WideCharToMultiByte に Unicode 文字列長として渡されていました。 dummy の値によっては Unicode 文字列の領域をはるかに超えるアクセスが行われ, ACCESS VIOLATION が発生します (なお,dummy という変数名は 4 バイトのダミーバッファ変数を流用したからで,決して ほめられるコーディングではありませんが,ここでは最低限の改修に留めています)

    具体的には,先日公開された Cygwin の新しい X11R7.4 の X サーバが,このバグにより起動時にクラッシュしていました。 GDBstrace ではコンソール出力が成功してしまうため,バグが再現せず, 現象を把握できませんでしたが,クラッシュ時に残された XWin.exe.stackdump ファイルのスタックトレースの引数に 0xFDE9 = 65001 = CP_UTF8 があることが解決の手がかりとなりました。もしもゴミでなければ,次の引数が 0, その次がスタック上の (おそらくローカル配列の) アドレス,その次がなにか大きな値 (ないし関数のアドレス?) であることから候補が十分に絞られます。

    Frame     Function  Args
    0022876C  77EA194A  (00018018, 656D5D5E, 00018016, 00000000)
    00228794  77EA1421  (0000FDE9, 00000000, 002287F0, 656E6967)
    002287C8  77E992A5  (0000FDE9, 00000000, 002287F0, 656E6967)
    0022C8E8  61026673  (61185BE8, 005C5EE0, 005C5F12, 00000000)
    ……
    

インストール方法

cygwin1-dll-20-11-18.tar.bz2 を展開すると, cygwin1.dll が得られます。 すべての Cygwin プロセスを終了させてから, C:\cygwin\bin に置きます。 Life with Cygwin 7.2 も参考にしてください。 Life with Cygwin 4.2.2 のように非 ASCII 文字を含むパス名 (「デスクトップ」など) を mount している場合は, C:\cygwin\bin\cygwin1.dll を置き換えた後,いったん Windows をログオフまたは再起動します。 共有メモリ上の mount テーブルを UTF-8 に切り替えるためです。

インストールに成功した場合,/proc/version の内容出力は下記の結果になります。 ただし NT-5.1 は Windows XP で実行した場合です。 Windows 2000 では NT-5.0 に, Windows Vista では NT-6.0 になります。

01:~$ cat /proc/version
CYGWIN_NT-5.1 1.5.25(0.156/4/2) 2008-11-18 15:24
01:~$ 

自分でコンパイルする場合は次のようにします。

    Cygwin の setup.exe 経由で,またはミラーサイトへの直接の ftp または http アクセスで cygwin-1.5.25-15-src.tar.bz2 を入手します。
  1. 下記のようにパッチを適用します。
    01:~$ tar xf cygwin-1.5.25-15-src.tar.bz2
    01:~$ cd cygwin-1.5.25-15/winsup
    01:~/cygwin-1.5.25-15/winsup$ bzcat ~/winsup-utf8-patch-20-11-18.diff.bz2 | patch -p0
    patching file ./cygwin/cygwin.sc
    patching file ./cygwin/fhandler.h
    patching file ./cygwin/fhandler_console.cc
    patching file ./cygwin/miscfuncs.cc
    patching file ./cygwin/path.cc
    patching file ./cygwin/spawn.cc
    patching file ./cygwin/winsup.h
    01:~/cygwin-1.5.25-15/winsup$
    
  2. cygwin-1.5.25-15 直下のディレクトリに移動して ./configure します。
    01:~/cygwin-1.5.25-15/winsup$ cd ..
    01:~/cygwin-1.5.25-15$ ./configure
    
  3. make します。
    01:~/cygwin-1.5.25-15$ make
    

    make がドキュメント生成段階で失敗しても, i686-pc-cygwin/winsup/cygwinnew-cygwin1.dllcygwin0.dll が出来ていればビルドは成功です。 両者の実体は同じです ("ls -i" で確認できます)。 C:\cygwin\bin\cygwin1.dll として置きます。 /proc/version の内容出力の日付と時刻は,dll の作成日時になります。

注意: 自分でコンパイルする場合は,make するディレクトリのパスに空白等を含めないようにするのが無難です。

cystart コマンド

cygutils-1.3.4-1-src.tar.bz2 に含まれる cygstart コマンドに対する変更前後のソースファイルと,便宜のためのコンパイル済みバイナリを md5sum 値とともに示します。

cygstart-exe-210424.tar.bz2 を展開すると cygstart.exe が得られます。 /bin/ (実体は C:\cygwin\bin) にコピーしてください。

自分でコンパイルする場合は, cygutils-1.3.4-1-src.tar.bz2 の内容を展開し, cygutils-1.3.4/src/cygstart/cygstart.c を, cygstart-21-04-24.tar.bz2 を展開して得られる cygstart.c に置き換えてコンパイルします。

設定ファイル

.bashrc, .inputrc, .vimrc をホームディレクトリに置きます。

python をインストールしている場合, sitecustomize.py/usr/lib/python2.5/site-packages/ に置きます。

注意: この設定ファイルは筆者が現在使っているものです。 UTF-8 のため以外の設定事項も含まれています。 使用法 を参考に,適宜内容を取捨選択してください。


ホーム ダウンロード 使用法 内部実装
Copyright (c) 2006 - 2009 OKI Software Co., Ltd.