Bug #9409
Cygwin で "filesystem" の encoding が正しくないケース
Status:
Open
Priority:
Normal
Assignee:
-
Target version:
-
ruby -v:
-
Description
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 #<Encoding:Windows-31J> "." #<Encoding:Windows-31J> ".." #<Encoding:Windows-31J> "test.rb" #<Encoding:Windows-31J> "\x{E697}\xA5\x{E69C}\xAC\x{E8AA}\x9E.txt" #<Encoding:UTF-8> "." #<Encoding:UTF-8> ".." #<Encoding:UTF-8> "test.rb" #<Encoding:UTF-8> "日本語.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);
Files