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

From: usa@...
Date: 2014-01-14 15:29:50 UTC
List: ruby-dev #47891
チケット #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

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



-- 
http://bugs.ruby-lang.org/

In This Thread

Prev Next