如果路径中有西里尔字符,如何使用 require
How to use require if there is Cyrillic char in the path
我正在尝试使用 Ruby 构建一个跨平台的可移植应用程序,但在 Windows 上出现问题。当路径中有西里尔字符(也许不是拉丁字符)时 require
不起作用:
D:\users\киї\Ruby.6\bin>ruby -v
ruby 2.6.3p62 (2019-04-16 revision 67580) [x64-mingw32]
D:\users\киї\Ruby.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.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.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.0\bin>ruby -e "require 'logger'"
D:\users\киї\Ruby.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
这帮助我解决了问题,运行 我的脚本来自路径中包含西里尔字母和空格的文件夹。
但它绝对应该被修复。
我正在尝试使用 Ruby 构建一个跨平台的可移植应用程序,但在 Windows 上出现问题。当路径中有西里尔字符(也许不是拉丁字符)时 require
不起作用:
D:\users\киї\Ruby.6\bin>ruby -v
ruby 2.6.3p62 (2019-04-16 revision 67580) [x64-mingw32]
D:\users\киї\Ruby.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.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.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.0\bin>ruby -e "require 'logger'"
D:\users\киї\Ruby.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
这帮助我解决了问题,运行 我的脚本来自路径中包含西里尔字母和空格的文件夹。
但它绝对应该被修复。