我需要使用 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/