Project

General

Profile

Bug #9409

Updated by nobu (Nobuyoshi Nakada) about 7 years ago

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`」という名前のファイルが存在 カレントディレクトリに「日本語.txt」という名前のファイルが存在 

 という状態で以下のコードを実行すると 

 ``` 
 print `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 <pre>LANG=ja_JP.UTF-8 

 #<Encoding:Windows-31J> #&lt;Encoding:Windows-31J&gt; 
 "." 
 #<Encoding:Windows-31J> #&lt;Encoding:Windows-31J&gt; 
 ".." 
 #<Encoding:Windows-31J> #&lt;Encoding:Windows-31J&gt; 
 "test.rb" 
 #<Encoding:Windows-31J> #&lt;Encoding:Windows-31J&gt; 
 "\x{E697}\xA5\x{E69C}\xAC\x{E8AA}\x9E.txt" 

 #<Encoding:UTF-8> #&lt;Encoding:UTF-8&gt; 
 "." 
 #<Encoding:UTF-8> #&lt;Encoding:UTF-8&gt; 
 ".." 
 #<Encoding:UTF-8> #&lt;Encoding:UTF-8&gt; 
 "test.rb" 
 #<Encoding:UTF-8> #&lt;Encoding:UTF-8&gt; 
 "日本語.txt" 

 ``` </pre> 

 本来ならば全ての Encoding が UTF-8 であるべきだと思います。 

 `Init_enc_set_filesystem_encoding()` Init_enc_set_filesystem_encoding() を以下のように修正すれば修正可能です。 

 ``` <pre> 
 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); 
 ``` </pre>

Back