[ruby-trunk - Bug #9409] Cygwin で "filesystem" の encoding が正しくないケ

チケット #9409 が Nayuta Taga によって更新されました。

Nobuyoshi N. wrote:

filesystem encodingはシステムの設定を反映するので、意図通りの動作ですね。

Windows ネイティブ環境ならばそうかもしれませんが、
Cygwin 環境ですので LANG に設定されているエンコーディングに従うべきではないのでしょうか?

少なくとも LANG=ja_JP.UTF-8 の状態で
Dir.open(‘.’).each{|item| p item.encoding }

#Encoding:Windows-31J
になるのはかなり予想外の挙動と言えると思います。


Bug #9409: Cygwin で “filesystem” の encoding が正しくないケース

  • 作成者: 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

#<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);

2014/1/14 [email protected]:

Dir.open(‘.’).each{|item| p item.encoding }
$B$,(B
#Encoding:Windows-31J
$B$K$J$k$N$O$+$J$jM=A[30$N5sF0$H8@$($k$H;W$$$^$9!#(B

$B$3$l$O(BWindows$B$N%U%!%$%k%7%9%F%`$N%k!<%k$J$N$G!“!J$o$?$7$K$O!KM=A[30$G$O$”$j$^$;$s$G$7$?!#(B
$B$b$&>/$7!“$J$<M=A[30$+!”$J$<:$$k$N$+!#JQ$($?>l9gDL>o$N(BWindows$B%“%W%j%1!<%7%g%s$G:n$C$?(B
$BF|K\8l%U%!%$%k$,FI$a$J$/$J$k$,!”$J$<$=$l$,K>$^$7$$$N$+!#$,5-:$5$l$F$$$k$H!"$h$j7z@_E*$J(B
$B5DO@$,=PMh$k$h$&$K;W$$$^$9!#(B