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

Issue #7881 has been reported by 5.5 (5 5).


Bug #7881: Windows でパスに日本語を含むスクリプトからの require が失敗する

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

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 が失敗する

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

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 が失敗する

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

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 が失敗する

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

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 が失敗する

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

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 が失敗する

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

Issue #7881 has been updated by nagachika (Tomoyuki C.).

素朴にバグかと思っていたのですが、File.expand_path の今現在の挙動のほうが望ましい場面っていうのは考えられるんでしょうか。

Bug #7881: Windows でパスに日本語を含むスクリプトからの require が失敗する

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

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 が失敗する

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

$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, [email protected] 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