ruby - 如果路径中有西里尔字符,如何使用 require

标签 ruby windows rubygems require

我正在尝试使用 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) 确保在当前控制台 session 中执行chcp 1251
2) 使用选项 --disable=gems 运行 Ruby,这样一开始它就不会失败。
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

这帮助我克服了这个问题,并从路径中包含西里尔文和空格的文件夹运行我的脚本。

但它绝对应该被修复。

关于ruby - 如果路径中有西里尔字符,如何使用 require,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56960125/

相关文章:

ruby - 是否有任何源代码分析工具检测 Ruby 中未使用的参数?

ruby-on-rails - 在 Gem 中搜索 Rails

ruby - 没有轨道的 ActiveRecord 时区

Windows/Perl/Net::SSLeay/OpenSSL:从哪些位置加载 CA 证书?

c++ - 如何修复 'Vcpkg/CMake Is Unable to determine target architecture'(Windows10、vcpkg、clion、cmake)

ruby-on-rails - Rails 命令不起作用(spring gem 错误)

ruby - 运行 rspec 时出现加载错误

ruby-on-rails - 指纹不能为空/内容 公钥无效

rubygems - Ruby On Rails - gem 的实际去向

c - dll 中控制台 I/O 的最佳选择