ruby - UTF-8 编码不适用于 Ruby 中的 gets 方法

标签 ruby

我需要使用 gets 方法获取 "öçğü" 字符串,但我做不到。我可以正确地从文件中读取。但是 gets 不接受这些字符。我使用 # encoding: UTF-8 并在 Windows cmd shell 上运行此代码。

当我尝试键入 ç 时,出现以下错误:

`downcase': input string invalid (ArgumentError)

input = gets.chomp.downcase.split

最佳答案

使用文件顶部的“魔术”注释设置文件编码仅指定文件中源代码的编码(即:直接从代码中的解析器创建的字符串文字的编码)。

Ruby 知道另外两种默认编码:

  • 外部编码 - 这指定了从外部源(例如控制台、打开的文件、网络套接字...)读取的数据的默认编码
  • 内部编码 - 从外部源读取的数据在读取后将转换为默认的内部编码,以确保您可以在任何地方使用兼容的编码(默认情况下不使用,因此保留外部编码)。

在你的情况下,你还没有设置外部编码。在 Windows 和 Ruby 3.0 之前的版本中,Ruby 假定您在此处安装的 Windows 的本地控制台编码(例如西欧的 cp850)。

当 Ruby 读取您的字符串时,它假定它采用 cp850 编码(或任何您的默认编码),而您可能提供 utf-8 编码数据。当您开始对这种编码不正确的数据进行操作时,您会遇到与您在此处看到的类似的错误。

因此,为了能够正确读取数据,您需要为它提供与您的 shell 编码匹配的编码,或者您需要告诉 Ruby 它应该采用哪种编码。

如果您提供的是 UTF-8 编码数据,则可以在调用 ruby​​ 时使用 -E 开关设置预期的编码,例如:

ruby -E utf-8 your_program.rb

您也可以在 Windows shell 的环境变量中使用

set RUBYOPT=-Eutf-8

在 Ruby 3.0 中,Windows 上的默认外部编码已更改,因此它现在在 Windows 上默认为 UTF-8,类似于其他平台。参见 https://bugs.ruby-lang.org/issues/16604了解详情。

关于ruby - UTF-8 编码不适用于 Ruby 中的 gets 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65471082/

相关文章:

ruby - REXML - 如何提取单个元素

Ruby:行 "m = Hash.new {|h,k| h[k] = []}"完成了什么而 "Hash.new"没有完成?

ruby - 对 Ancestry 类型数据库 : MongoDB, Redis 等的建议?

ruby-on-rails - 如何将数组的元素添加到另一个数组并删除重复项

ruby-on-rails - 从嵌套哈希中删除所有相似的键

mysql - rails mysql 正则表达式输入未正确清理

ruby-on-rails - Rails 4 app redirect_to 在发布请求后不重新加载网页

ruby - 当我访问 AppFog 上的 Sinatra 应用程序时显示 "Forbidden"消息

ruby - 使用注入(inject)时可以分离出散列的键和值吗?

ruby - 在 Ruby 中,一个绑定(bind)对象会携带一个 block ?