无法使用JRuby打开带有特殊字符的文件

时间:2012-11-22 14:23:04

标签: file-io encoding jruby

下面的程序适用于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打包在一起,所以我担心命令行参数不是一个选项。

2 个答案:

答案 0 :(得分:1)

这是报告bug Dir.glob

答案 1 :(得分:1)

正如Sebastien所说,这是一个已知的错误。

我实际上找到了这个bug的解决方法。在这种情况下,我想要目录中的每个文件,而不是使用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