Search code examples
rubywindowsrubygemsrequire

How to use require if there is Cyrillic char in the path


I’m trying to build a cross-platform portable application with Ruby and there is a problem on Windows. When there is a Cyrillic character (maybe just not Latin) in the path require doesn’t work:

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)

We can see such encoding transformations in the output:

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

I have an old Ruby installation that works fine:

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]

The same is for ruby 2.0.0p643 (2015-02-25) [i386-mingw32].

I also checked that require fails in the same case for

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

Solution

  • Looks like there is an ugly workaround.

    1) Ensure to do chcp 1251 in current console session.
    2) Run Ruby with an option --disable=gems so it will not fail initially.
    3) Add next code at the very beginning of a script:

    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
    

    This helped me to overcome the problem and run my script from a folder with Cyrillic and spaces in the path.

    But it definitely should be fixed.