Forum: Ruby-dev [ruby-trunk - Bug #7881][Open] Windows でパスに日本語を含むスクリプトからの require が失敗する

Posted by 5.5 (5 5) (Guest)
on 2013-02-19 03:37
(Received via mailing list)
Issue #7881 has been reported by 5.5 (5 5).

----------------------------------------
Bug #7881: Windows でパスに日本語を含むスクリプトからの require が失敗する
https://bugs.ruby-lang.org/issues/7881

Author: 5.5 (5 5)
Status: Open
Priority: Normal
Assignee:
Category:
Target version: 1.9.3
ruby -v: ruby 1.9.3p385 (2013-02-06) [i386-mingw32]


=begin
Windows でパスに日本語を含むスクリプトからの require が失敗します。

Ruby 1.9.3 の p374,p385 でこの現象が起こりますが,p125 では起こりません。
p286 あたりから起こるようになったと思います。

【再現手順】
(1) d:/テスト というフォルダーを作る。
(2) d:/テスト/a.rb を下記のように書く。
(3) d:/テスト/b.rb を下記のように書く。
(4) cd /テスト
(5) ruby a.rb

a.rb の内容:

 # encoding: utf-8
 require "./b"

b.rb の内容

 # encoding: utf-8
 puts "No problem."

これで,

cannot load such file -- ./b (LoadError)

が出ます。

* フォルダー名を「テスト」から「test」に変えると正常に動作します。
* a.rb のスクリプトエンコーディングを CP932 に変えると正常に動作します。
* require "./b" を require "./b".encode("CP932") に変えると正常に動作します。
* 標準添付ライブラリーや gem はふつうに require できます。



=end
Posted by ko1 (Koichi Sasada) (Guest)
on 2013-02-22 00:55
(Received via mailing list)
Issue #7881 has been updated by ko1 (Koichi Sasada).

Category set to core
Assignee set to usa (Usaku NAKAMURA)

usa さんか naruse さんかわからなかったんですが、とりあえず usa さんへアサイン。
----------------------------------------
Bug #7881: Windows でパスに日本語を含むスクリプトからの require が失敗する
https://bugs.ruby-lang.org/issues/7881#change-36728

Author: 5.5 (5 5)
Status: Open
Priority: Normal
Assignee: usa (Usaku NAKAMURA)
Category: core
Target version: 1.9.3
ruby -v: ruby 1.9.3p385 (2013-02-06) [i386-mingw32]


=begin
Windows でパスに日本語を含むスクリプトからの require が失敗します。

Ruby 1.9.3 の p374,p385 でこの現象が起こりますが,p125 では起こりません。
p286 あたりから起こるようになったと思います。

【再現手順】
(1) d:/テスト というフォルダーを作る。
(2) d:/テスト/a.rb を下記のように書く。
(3) d:/テスト/b.rb を下記のように書く。
(4) cd /テスト
(5) ruby a.rb

a.rb の内容:

 # encoding: utf-8
 require "./b"

b.rb の内容

 # encoding: utf-8
 puts "No problem."

これで,

cannot load such file -- ./b (LoadError)

が出ます。

* フォルダー名を「テスト」から「test」に変えると正常に動作します。
* a.rb のスクリプトエンコーディングを CP932 に変えると正常に動作します。
* require "./b" を require "./b".encode("CP932") に変えると正常に動作します。
* 標準添付ライブラリーや gem はふつうに require できます。



=end
Posted by usa (Usaku NAKAMURA) (Guest)
on 2013-02-25 07:16
(Received via mailing list)
Issue #7881 has been updated by usa (Usaku NAKAMURA).

Status changed from Open to Assigned
Assignee changed from usa (Usaku NAKAMURA) to h.shirosaki (Hiroshi 
Shirosaki)

なんとなく、いつぞやのWindowsのrequire高速化関連のような気もするのですが、
しろさきさん何かわかったりしますか?

# その前の奴かなあ?
----------------------------------------
Bug #7881: Windows でパスに日本語を含むスクリプトからの require が失敗する
https://bugs.ruby-lang.org/issues/7881#change-36984

Author: 5.5 (5 5)
Status: Assigned
Priority: Normal
Assignee: h.shirosaki (Hiroshi Shirosaki)
Category: core
Target version: 1.9.3
ruby -v: ruby 1.9.3p385 (2013-02-06) [i386-mingw32]


=begin
Windows でパスに日本語を含むスクリプトからの require が失敗します。

Ruby 1.9.3 の p374,p385 でこの現象が起こりますが,p125 では起こりません。
p286 あたりから起こるようになったと思います。

【再現手順】
(1) d:/テスト というフォルダーを作る。
(2) d:/テスト/a.rb を下記のように書く。
(3) d:/テスト/b.rb を下記のように書く。
(4) cd /テスト
(5) ruby a.rb

a.rb の内容:

 # encoding: utf-8
 require "./b"

b.rb の内容

 # encoding: utf-8
 puts "No problem."

これで,

cannot load such file -- ./b (LoadError)

が出ます。

* フォルダー名を「テスト」から「test」に変えると正常に動作します。
* a.rb のスクリプトエンコーディングを CP932 に変えると正常に動作します。
* require "./b" を require "./b".encode("CP932") に変えると正常に動作します。
* 標準添付ライブラリーや gem はふつうに require できます。



=end
Posted by h.shirosaki (Hiroshi Shirosaki) (Guest)
on 2013-02-27 11:09
(Received via mailing list)
Issue #7881 has been updated by h.shirosaki (Hiroshi Shirosaki).


=begin
Windowsのexpand_pathのencodingのバグのようです。

osxだとcurrent 
directoryのpathに日本語を含むかどうかでencodingがかわるので、Windowsもそのように修正したいと思います。

 $ cat test_expand_path.rb
 # coding: sjis
 p File.expand_path("./a")
 p File.expand_path("./a").encoding
 $ ruby -v test_expand_path.rb
 ruby 2.1.0dev (2013-02-27 trunk 39526) [x86_64-darwin12.2.0]
 "/Users/hiroshi/work/a"
 #<Encoding:Windows-31J>
 $ cd あああ
 $ ruby -v ../test_expand_path.rb
 ruby 2.1.0dev (2013-02-27 trunk 39526) [x86_64-darwin12.2.0]
 "/Users/hiroshi/work/あああ/a"
 #<Encoding:UTF-8>
=end

----------------------------------------
Bug #7881: Windows でパスに日本語を含むスクリプトからの require が失敗する
https://bugs.ruby-lang.org/issues/7881#change-37143

Author: 5.5 (5 5)
Status: Assigned
Priority: Normal
Assignee: h.shirosaki (Hiroshi Shirosaki)
Category: core
Target version: next minor
ruby -v: ruby 1.9.3p385 (2013-02-06) [i386-mingw32]


=begin
Windows でパスに日本語を含むスクリプトからの require が失敗します。

Ruby 1.9.3 の p374,p385 でこの現象が起こりますが,p125 では起こりません。
p286 あたりから起こるようになったと思います。

【再現手順】
(1) d:/テスト というフォルダーを作る。
(2) d:/テスト/a.rb を下記のように書く。
(3) d:/テスト/b.rb を下記のように書く。
(4) cd /テスト
(5) ruby a.rb

a.rb の内容:

 # encoding: utf-8
 require "./b"

b.rb の内容

 # encoding: utf-8
 puts "No problem."

これで,

cannot load such file -- ./b (LoadError)

が出ます。

* フォルダー名を「テスト」から「test」に変えると正常に動作します。
* a.rb のスクリプトエンコーディングを CP932 に変えると正常に動作します。
* require "./b" を require "./b".encode("CP932") に変えると正常に動作します。
* 標準添付ライブラリーや gem はふつうに require できます。



=end
Posted by usa (Usaku NAKAMURA) (Guest)
on 2013-02-27 11:41
(Received via mailing list)
Issue #7881 has been updated by usa (Usaku NAKAMURA).


あれ、これはWindowsでは互換性のためにわざと常にlocaleでexpand_pathされるようにしておいたような記憶があるのですが。

そろそろこの仕様を変えるのはアリだとは思いますが、1.9.3はちょっと意図的ではないので元の挙動に戻したいです。
2.0.0は... 現状優先なのかなあ。


 C:\> type a.rb
 # coding: utf-8
 unless ''.respond_to?("encoding")
   class String
     def encoding
       "dummy"
     end
   end
 end
 path = File.expand_path("./a")
 p [path, path.encoding]

 C:\> ruby187p371 -v a.rb
 ruby 1.8.7 (2012-10-12 patchlevel 371) [i386-mswin32]
 ["C:/a", "dummy"]

 C:\> ruby193p0 -v a.rb
 ruby 1.9.3p0 (2011-10-30 revision 33570) [x64-mswin64_100]
 ["C:/a", #<Encoding:Windows-31J>]

 C:\> ruby193p392 -v a.rb
 ruby 1.9.3p392 (2013-02-22 revision 39386) [x64-mswin64_100]
 ["C:/a", #<Encoding:UTF-8>]

 C:\> ruby200p0 -v a.rb
 ruby 2.0.0p0 (2013-02-24 revision 39474) [x64-mswin64_100]
 ["C:/a", #<Encoding:UTF-8>]

 C:\> cd てすと

 C:\> ruby187p371 -v a.rb
 ruby 1.8.7 (2012-10-12 patchlevel 371) [i386-mswin32]
 ["C:/\202\304\202\267\202\306/a", "dummy"]

 C:\> ruby193p0 -v a.rb
 ruby 1.9.3p0 (2011-10-30 revision 33570) [x64-mswin64_100]
 ["C:/てすと/a", #<Encoding:Windows-31J>]

 C:\> ruby193p392 -v a.rb
 ruby 1.9.3p392 (2013-02-22 revision 39386) [x64-mswin64_100]
 ["C:/\u3066\u3059\u3068/a", #<Encoding:UTF-8>]

 C:\> ruby200p0 -v a.rb
 ruby 2.0.0p0 (2013-02-24 revision 39474) [x64-mswin64_100]
 ["C:/\u3066\u3059\u3068/a", #<Encoding:UTF-8>]

----------------------------------------
Bug #7881: Windows でパスに日本語を含むスクリプトからの require が失敗する
https://bugs.ruby-lang.org/issues/7881#change-37145

Author: 5.5 (5 5)
Status: Assigned
Priority: Normal
Assignee: h.shirosaki (Hiroshi Shirosaki)
Category: core
Target version: next minor
ruby -v: ruby 1.9.3p385 (2013-02-06) [i386-mingw32]


=begin
Windows でパスに日本語を含むスクリプトからの require が失敗します。

Ruby 1.9.3 の p374,p385 でこの現象が起こりますが,p125 では起こりません。
p286 あたりから起こるようになったと思います。

【再現手順】
(1) d:/テスト というフォルダーを作る。
(2) d:/テスト/a.rb を下記のように書く。
(3) d:/テスト/b.rb を下記のように書く。
(4) cd /テスト
(5) ruby a.rb

a.rb の内容:

 # encoding: utf-8
 require "./b"

b.rb の内容

 # encoding: utf-8
 puts "No problem."

これで,

cannot load such file -- ./b (LoadError)

が出ます。

* フォルダー名を「テスト」から「test」に変えると正常に動作します。
* a.rb のスクリプトエンコーディングを CP932 に変えると正常に動作します。
* require "./b" を require "./b".encode("CP932") に変えると正常に動作します。
* 標準添付ライブラリーや gem はふつうに require できます。



=end
Posted by h.shirosaki (Hiroshi Shirosaki) (Guest)
on 2013-02-27 12:38
(Received via mailing list)
Issue #7881 has been updated by h.shirosaki (Hiroshi Shirosaki).


usa (Usaku NAKAMURA) wrote:
> あれ、これはWindowsでは互換性のためにわざと常にlocaleでexpand_pathされるようにしておいたような記憶があるのですが。
>
1.9.3のunixでは常にlocaleになるように修正されていましたが、windowsではbackportするときには、そのまま(2.0.0と同じ)で手は入れられていないのではないでしょうか。

encodingを常にfile system encodingにするのは、たぶん以下の行以降のcpとpath_encodingをfile 
system encodingにすればよいと思います。
https://github.com/ruby/ruby/blob/trunk/win32/file.c#L584

> そろそろこの仕様を変えるのはアリだとは思いますが、1.9.3はちょっと意図的ではないので元の挙動に戻したいです。
> 2.0.0は... 現状優先なのかなあ。
>

> C:\てすと> ruby200p0 -v a.rb
> ruby 2.0.0p0 (2013-02-24 revision 39474) [x64-mswin64_100]
> ["C:/\u3066\u3059\u3068/a", #<Encoding:UTF-8>]

trunkのosxでの動作から考えると、このencodingがWindows-31Jになるのがよいと思ったのですが、現状がよいのでしょうか?
----------------------------------------
Bug #7881: Windows でパスに日本語を含むスクリプトからの require が失敗する
https://bugs.ruby-lang.org/issues/7881#change-37148

Author: 5.5 (5 5)
Status: Assigned
Priority: Normal
Assignee: h.shirosaki (Hiroshi Shirosaki)
Category: core
Target version: next minor
ruby -v: ruby 1.9.3p385 (2013-02-06) [i386-mingw32]


=begin
Windows でパスに日本語を含むスクリプトからの require が失敗します。

Ruby 1.9.3 の p374,p385 でこの現象が起こりますが,p125 では起こりません。
p286 あたりから起こるようになったと思います。

【再現手順】
(1) d:/テスト というフォルダーを作る。
(2) d:/テスト/a.rb を下記のように書く。
(3) d:/テスト/b.rb を下記のように書く。
(4) cd /テスト
(5) ruby a.rb

a.rb の内容:

 # encoding: utf-8
 require "./b"

b.rb の内容

 # encoding: utf-8
 puts "No problem."

これで,

cannot load such file -- ./b (LoadError)

が出ます。

* フォルダー名を「テスト」から「test」に変えると正常に動作します。
* a.rb のスクリプトエンコーディングを CP932 に変えると正常に動作します。
* require "./b" を require "./b".encode("CP932") に変えると正常に動作します。
* 標準添付ライブラリーや gem はふつうに require できます。



=end
Posted by U.Nakamura (Guest)
on 2013-02-28 09:56
(Received via mailing list)
$B$3$s$K$A$O!"$J$+$`$i(B($B$&(B)$B$G$9!#(B

In message "[ruby-dev:47123] [ruby-trunk - Bug #7881] Windows 
$B$G%Q%9$KF|K\8l$r4^$`%9%/%j%W%H$+$i$N(B require $B$,<:GT$9$k(B"
    on Feb.27,2013 20:38:05, <h.shirosaki@gmail.com> wrote:
> > 
$B$"$l!"$3$l$O(BWindows$B$G$O8_49@-$N$?$a$K$o$6$H>o$K(Blocale$B$G(Bexpand_path$B$5$l$k$h$&$K$7$F$*$$$?$h$&$J5-21$,$"$k$N$G$9$,!#(B
> >
> 
1.9.3$B$N(Bunix$B$G$O>o$K(Blocale$B$K$J$k$h$&$K=$@5$5$l$F$$$^$7$?$,!"(Bwindows$B$G$O(Bbackport$B$9$k$H$-$K$O!"$=$N$^$^(B(2.0.0$B$HF1$8(B)$B$G<j$OF~$l$i$l$F$$$J$$$N$G$O$J$$$G$7$g$&$+!#(B

$B0U?^$r<($9%F%9%H$,$J$$$;$$$G5$IU$+$J$+$C$?$N$G$9$+$M$(!#(B
$B$"$H$GK\Ev$K%F%9%H$,$J$+$C$?$N$+$I$&$+C5$=$&!#(B


> encoding$B$r>o$K(Bfile system 
encoding$B$K$9$k$N$O!"$?$V$s0J2<$N9T0J9_$N(Bcp$B$H(Bpath_encoding$B$r(Bfile system 
encoding$B$K$9$l$P$h$$$H;W$$$^$9!#(B
> https://github.com/ruby/ruby/blob/trunk/win32/file.c#L584

$B$"$j$,$H$&$4$6$$$^$9!#(B


> > 
$B$=$m$=$m$3$N;EMM$rJQ$($k$N$O%"%j$@$H$O;W$$$^$9$,!"(B1.9.3$B$O$A$g$C$H0U?^E*$G$O$J$$$N$G85$N5sF0$KLa$7$?$$$G$9!#(B
> > 2.0.0$B$O(B... $B8=>uM%@h$J$N$+$J$"!#(B
>
> > C:\$B$F$9$H(B> ruby200p0 -v a.rb
> > ruby 2.0.0p0 (2013-02-24 revision 39474) [x64-mswin64_100]
> > ["C:/\u3066\u3059\u3068/a", #<Encoding:UTF-8>]
>
> 
trunk$B$N(Bosx$B$G$NF0:n$+$i9M$($k$H!"$3$N(Bencoding$B$,(BWindows-31J$B$K$J$k$N$,$h$$$H;W$C$?$N$G$9$,!"8=>u$,$h$$$N$G$7$g$&$+(B?

$B0U?^$O$H$b$+$/5sF0$OJQ$o$C$A$c$C$F$k$N$G!"$"$($F%P%0$@$H8@$o(B
$B$:$K;EMM$@$H2!$7@Z$C$?J}$,>-Mh3Z$+$b!"$H$+!#(B

$B$^$"!"$"$s$^$j6/$$0U8+$O$J$$$N$G!"(B2.0.0$B%a%s%F%J$N6a1J$5$s$HAj(B
$BCL$G$9$+$M$(!#(B


$B$=$l$G$O!#(B
Posted by nagachika (Tomoyuki Chikanaga) (Guest)
on 2013-03-03 14:52
(Received via mailing list)
Issue #7881 has been updated by nagachika (Tomoyuki Chikanaga).


素朴にバグかと思っていたのですが、File.expand_path の今現在の挙動のほうが望ましい場面っていうのは考えられるんでしょうか。
----------------------------------------
Bug #7881: Windows でパスに日本語を含むスクリプトからの require が失敗する
https://bugs.ruby-lang.org/issues/7881#change-37274

Author: 5.5 (5 5)
Status: Assigned
Priority: Normal
Assignee: h.shirosaki (Hiroshi Shirosaki)
Category: core
Target version: next minor
ruby -v: ruby 1.9.3p385 (2013-02-06) [i386-mingw32]


=begin
Windows でパスに日本語を含むスクリプトからの require が失敗します。

Ruby 1.9.3 の p374,p385 でこの現象が起こりますが,p125 では起こりません。
p286 あたりから起こるようになったと思います。

【再現手順】
(1) d:/テスト というフォルダーを作る。
(2) d:/テスト/a.rb を下記のように書く。
(3) d:/テスト/b.rb を下記のように書く。
(4) cd /テスト
(5) ruby a.rb

a.rb の内容:

 # encoding: utf-8
 require "./b"

b.rb の内容

 # encoding: utf-8
 puts "No problem."

これで,

cannot load such file -- ./b (LoadError)

が出ます。

* フォルダー名を「テスト」から「test」に変えると正常に動作します。
* a.rb のスクリプトエンコーディングを CP932 に変えると正常に動作します。
* require "./b" を require "./b".encode("CP932") に変えると正常に動作します。
* 標準添付ライブラリーや gem はふつうに require できます。



=end
Posted by h.shirosaki (Hiroshi Shirosaki) (Guest)
on 2013-03-05 06:55
(Received via mailing list)
Issue #7881 has been updated by h.shirosaki (Hiroshi Shirosaki).


=begin

たとえば、下記のようなコードを書いたときに、current directoryのパスが日本語を含んでいても
Encoding::CompatibilityError にならずに動く、という利点はあるのではないでしょうか。

expand_pathの結果がfilesystem 
encodingに変わる可能性があれば、日本語の引数に.encode('filesystem')をつけるなどしておかないといけません。

 # coding: euc-jp

 expand = File.expand_path('あ')
 p [expand, expand.encoding]
 path = File.join(expand, "あああ")
 p [path, path.encoding]


あと、報告のあったrequire "./b" に関しては require_relative "b" でも動作するようです。

=end
----------------------------------------
Bug #7881: Windows でパスに日本語を含むスクリプトからの require が失敗する
https://bugs.ruby-lang.org/issues/7881#change-37295

Author: 5.5 (5 5)
Status: Assigned
Priority: Normal
Assignee: h.shirosaki (Hiroshi Shirosaki)
Category: core
Target version: next minor
ruby -v: ruby 1.9.3p385 (2013-02-06) [i386-mingw32]


=begin
Windows でパスに日本語を含むスクリプトからの require が失敗します。

Ruby 1.9.3 の p374,p385 でこの現象が起こりますが,p125 では起こりません。
p286 あたりから起こるようになったと思います。

【再現手順】
(1) d:/テスト というフォルダーを作る。
(2) d:/テスト/a.rb を下記のように書く。
(3) d:/テスト/b.rb を下記のように書く。
(4) cd /テスト
(5) ruby a.rb

a.rb の内容:

 # encoding: utf-8
 require "./b"

b.rb の内容

 # encoding: utf-8
 puts "No problem."

これで,

cannot load such file -- ./b (LoadError)

が出ます。

* フォルダー名を「テスト」から「test」に変えると正常に動作します。
* a.rb のスクリプトエンコーディングを CP932 に変えると正常に動作します。
* require "./b" を require "./b".encode("CP932") に変えると正常に動作します。
* 標準添付ライブラリーや gem はふつうに require できます。



=end
Please log in before posting. Registration is free and takes only a minute.
Existing account (Switch to SSL-encrypted connection)
NEW: Do you have a Google/GoogleMail or Yahoo account? No registration required!
Log in with Google account | Log in with Yahoo account
No account? Register here.