路径中是否有西里尔字母,如何使用

反演

我正在尝试使用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)确保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

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

但这绝对应该修复。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章