0

次のプログラムは ruby​​ では問題なく動作しますが、「mão.txt」という名前のテスト用に使用しているような特殊文字を含むファイルにアクセスすると、JRuby で問題が発生します。

# coding: utf-8

puts "(A) #{__ENCODING__}"

puts "(B)" + "".encoding.to_s
puts "(C)" + String.new.encoding.to_s

Dir.glob("./fixtures/*").each do |f|
    puts "(D)" + f.encoding.to_s + "  " + f
    File.open(f)
    g = File.expand_path(f)
    puts "(E)" + g + " " + g.encoding.to_s
    File.open(g)
end

JRuby での結果は次のとおりです。

(A) UTF-8
(B)UTF-8
(C)ASCII-8BIT
(D)ASCII-8BIT  ./fixtures/mão.txt~
Errno::ENOENT: No such file or directory - ./fixtures/mão.txt~
  initialize at org/jruby/RubyFile.java:315
        open at org/jruby/RubyIO.java:1176
      (root) at encoding.rb:10
        each at org/jruby/RubyArray.java:1612
      (root) at encoding.rb:8

Ubuntu 12.10、JRuby 1.7.0、および Java 1.7.0_09 を使用しています

アプリケーションを Warble にパッケージ化する予定なので、コマンド ライン引数はオプションではないのではないかと心配しています。

4

2 に答える 2

1

これはで報告されたバグDir.globです。

于 2012-11-23T06:28:26.107 に答える
1

Sebastien が述べたように、これは既知のバグです。

私は実際にこのバグの回避策を見つけました。Dir.glob を使用する代わりに、この場合、ディレクトリ内のすべてのファイルが必要なため、Dir.entries を使用するだけで問題なく動作します。

プログラムは次のように変更できます。

# coding: utf-8
path = File.expand_path(File.dirname(__FILE__))
puts "(A) #{__ENCODING__}"

puts "(B)" + "".encoding.to_s
puts "(C)" + String.new.encoding.to_s

dir = "#{path}/fixtures/"
entries = Dir.entries(dir) - ['.', '..']
entries.each do |f| 
    puts "(D)" + f.encoding.to_s + "  " + f
    file = "#{dir}/#{f}"
    puts "(E)" + file.encoding.to_s + "  " + file
    #f.encode("UTF-8")
    File.open(file)
    g = File.expand_path(file)
    puts "(F)" + g + " " + g.encoding.to_s
    File.open(g)
end
于 2012-11-23T16:43:17.287 に答える