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

Posted

技术标签:

【中文标题】如果路径中有西里尔字符,如何使用 require【英文标题】:How to use require if there is Cyrillic char in the path 【发布时间】:2019-11-19 10:57:25 【问题描述】:

我正在尝试使用 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]

【问题讨论】:

您应该考虑将此报告给 ruby​​ 开发团队bugs.ruby-lang.org/projects/ruby/wiki/HowToReport 还有 2.7.0 的预览版。可以试一试 对于 Windows,2.7 还没有安装程序 — rubyinstaller.org/downloads 我们可以看到所需文件的内容吗? 'logger' 是默认的 gem。但它对任何宝石都失败了。 【参考方案1】:

看起来有一个丑陋的解决方法

1) 确保在当前控制台会话中执行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

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

但绝对应该修复它。

【讨论】:

报告的问题 — bugs.ruby-lang.org/issues/15993

以上是关于如果路径中有西里尔字符,如何使用 require的主要内容,如果未能解决你的问题,请参考以下文章

带有西里尔字符的文件路径的 Java java.io.filenotfoundexception

Unicode映射到语言

seo 友好的 url 使用西里尔字符 х 字符,它总是得到 404。如何修复它?

西里尔字符的 DOMPDF 问题

Qt同时使用多个字体

搜索包含西里尔文数据的 SQLite 数据库