From: usa@... Date: 2014-01-14T15:29:50+00:00 Subject: [ruby-dev:47891] [ruby-trunk - Bug #9409] Cygwin で "filesystem" の encoding が正しくないケース チケット #9409 が Usaku NAKAMURA によって更新されました。 Nayuta Taga wrote: > Windows ネイティブ環境ならばそうかもしれませんが、 > Cygwin 環境ですので LANG に設定されているエンコーディングに従うべきではないのでしょうか? Cygwinだろうがなんだろうが、Windowsにおいて、ファイルシステムの保持する エンコーディングをRubyが勝手に違うものとみなすことはできません。 ---------------------------------------- Bug #9409: Cygwin で "filesystem" の encoding が正しくないケース https://bugs.ruby-lang.org/issues/9409#change-44297 * 作成者: Nayuta Taga * ステータス: Open * 優先度: Normal * 担当者: * カテゴリ: * 対象バージョン: * ruby -v: - * Backport: 1.9.3: UNKNOWN, 2.0.0: UNKNOWN, 2.1: UNKNOWN ---------------------------------------- Cygwin で環境変数 LANG に設定されているエンコーディングと システムのコードページが異なる場合 "filesystem" の encoding が正しく設定されないようです。 例えば、 * Windows 7 (日本語) * Cygwin 環境 (CYGWIN_NT-6.1-WOW64 ****** 1.7.27(0.271/5/3) 2013-12-09 11:57 i686 Cygwin) * 環境変数 LANG は ja_JP.UTF-8 * カレントディレクトリに「`日本語.txt`」という名前のファイルが存在 という状態で以下のコードを実行すると ``` print "LANG=#{ENV['LANG']}\n" print "\n" Dir.open('.').each{|item| p item.encoding p item } print "\n" Dir.open('.',encoding: 'locale').each{|item| p item.encoding p item } print "\n" ``` 例えば以下のような出力が得られます。 ``` LANG=ja_JP.UTF-8 # "." # ".." # "test.rb" # "\x{E697}\xA5\x{E69C}\xAC\x{E8AA}\x9E.txt" # "." # ".." # "test.rb" # "日本語.txt" ``` 本来ならば全ての Encoding が UTF-8 であるべきだと思います。 `Init_enc_set_filesystem_encoding()` を以下のように修正すれば修正可能です。 ``` Index: localeinit.c =================================================================== --- localeinit.c (revision 44594) +++ localeinit.c (working copy) @@ -53,7 +53,7 @@ int idx; #if defined NO_LOCALE_CHARMAP # error NO_LOCALE_CHARMAP defined -#elif defined _WIN32 || defined __CYGWIN__ +#elif defined _WIN32 && !defined __CYGWIN__ char cp[sizeof(int) * 8 / 3 + 4]; snprintf(cp, sizeof cp, "CP%d", AreFileApisANSI() ? GetACP() : GetOEMCP()); idx = rb_enc_find_index(cp); ``` -- http://bugs.ruby-lang.org/