UTF-8编码在Ruby的gets方法中无法工作

3

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

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

`downcase': input string invalid (ArgumentError)

input = gets.chomp.downcase.split

它说UTF-8。我不懂。我可以用代码写出来,但我无法从“gets”获取。 - sabrey
你在 Ruby 中设置的编码必须与你的终端的编码匹配。那么,你的终端编码是什么? - Jörg W Mittag
我不知道,但有人说原因是Windows命令行。我在在线编译器上尝试过,它可以工作。 - sabrey
1个回答

3

使用文件顶部的“magic”注释设置文件编码仅指定文件中源代码的编码(即:您在代码中直接创建的字符串文字的编码)。

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上的默认外部编码已更改为UTF-8,与其他平台类似。详情请参见https://bugs.ruby-lang.org/issues/16604

我下载了 Ruby 3.0,但仍然出现相同的错误。"`downcase': input string invalid (ArgumentError)" - sabrey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接