Имена файлов Unicode для Windows в Ruby

У меня есть фрагмент кода, который выглядит так:

Dir.new(path).each do |entry|
    puts entry
end

Проблема возникает, когда у меня есть файл с именем こ ん に ち は 世界.txt в списке, который я перечисляю. На машине с Windows 7 я получаю вывод:

???????.txt

От googling вокруг, правильное чтение этого имени файла на окнах кажется невыполнимой задачей. Любые предложения?

Ответ 1

Вам не повезло с чистым рубином (1,8 или 1,9,1), так как он использует ANSI-версии Windows API.

Кажется, что Ruby 1.9.2 будет поддерживать имена файлов Unicode в Windows. Этот отчет об ошибке имеет 1.9.2 в качестве цели. Согласно это объявление Ruby 1.9.2 выйдет в конце июля 2010 года.

Если вам это действительно нужно раньше, вы можете попытаться использовать FindFirstFileW и т.д. непосредственно через Win32API.new или win32-api.

Ответ 2

У меня была такая же проблема, и я просто понял, как получить записи в UTF-8 в Windows. Следующие работали для меня (с использованием Ruby 1.9.2p136):

opts = {}
opts[:encoding] = "UTF-8"
entries = Dir.entries(path, opts)
entries.each do |entry|
  # example
  stat = File::stat(entry)
  puts "Size: " + String(stat.size)
end

Ответ 3

Моим решением было использовать Dir.glob вместо Dir.entries. Но он работает только с параметром *. Это не работает при прохождении пути (c:/dir/*). Протестировано в версиях 1.9.2p290 и 1.9.3p0 в Windows 7.

Есть много других проблем с путями unicode в Windows. Он по-прежнему является открытой проблемой. Патчи в настоящее время нацелены на Ruby 2.0, который по слухам будет выпущен в 2013 году.