Как использовать require, если в пути есть кириллица - PullRequest
7 голосов
/ 09 июля 2019

Я пытаюсь создать кроссплатформенное портативное приложение на Ruby, и в Windows возникла проблема. Когда в пути require не работает кириллический символ (может быть, просто не латиница):

D:\users\киї\Ruby\2.6\bin>ruby -v
ruby 2.6.3p62 (2019-04-16 revision 67580) [x64-mingw32]

D:\users\киї\Ruby\2.6\bin>ruby -e "require 'logger'"
Traceback (most recent call last):
        1: from <internal:gem_prelude>:2:in `<internal:gem_prelude>'
<internal:gem_prelude>:2:in `require': No such file or directory -- D:/users/РєРёС—/Ruby/2.6/lib/ruby/2.6.0/rubygems.rb (LoadError)

D:\users\киї\Ruby\2.6\bin>ruby --disable=rubyopt -e "require 'logger'"
Traceback (most recent call last):
        1: from <internal:gem_prelude>:2:in `<internal:gem_prelude>'
<internal:gem_prelude>:2:in `require': No such file or directory -- D:/users/РєРёС—/Ruby/2.6/lib/ruby/2.6.0/rubygems.rb (LoadError)

D:\users\киї\Ruby\2.6\bin>gem list
Traceback (most recent call last):
        1: from <internal:gem_prelude>:2:in `<internal:gem_prelude>'
<internal:gem_prelude>:2:in `require': No such file or directory -- D:/users/РєРёС—/Ruby/2.6/lib/ruby/2.6.0/rubygems.rb (LoadError)

Мы можем видеть такие преобразования кодирования в выводе:

РєРёС— -> киї
win1251 -> utf-8

У меня есть старая установка Ruby, которая отлично работает:

D:\users\киї\Ruby\2.0\bin>ruby -e "require 'logger'"

D:\users\киї\Ruby\2.0\bin>ruby -v
ruby 2.0.0p451 (2014-02-24) [i386-mingw32]

То же самое для ruby 2.0.0p643 (2015-02-25) [i386-mingw32].

Я также проверил, что require терпит неудачу в том же случае для

ruby 2.1.9p490 (2016-03-30 revision 54437) [i386-mingw32]

1 Ответ

0 голосов
/ 12 июля 2019

Похоже, что существует ужасный обходной путь .

1) Убедитесь, что в текущем сеансе консоли выполняется chcp 1251.
2) Запустите Ruby с параметром --disable=gems, поэтомуизначально он не потерпит неудачу.
3) Добавьте следующий код в самом начале скрипта:

if $:[0].encoding.name == 'Windows-1251'
    $:.each {|path| path.encode! 'UTF-8' }
    $:.push '.'    # somehow it helps, looks like a modification of array is needed
    require 'rubygems'
end

Это помогло мне преодолеть проблему и запустить мой скрипт из папки с кириллицей и пробелами впуть.

Но он определенно должен быть исправлен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...