Ruby字符串连接与整数(代码点?)

时间:2013-09-12 20:03:57

标签: ruby string integer concatenation

所以,我很无聊,而且我发现似乎是一种奇怪的不一致,我希望能找到更多信息。这涉及Ruby中的字符串连接,特别是附加字符串文档所指的“代码点”。

以下是一些例子:

'' << 233 #=> "é"
'' << 256 #=> "Ā"

现在,奇怪的是,在IRB中,这两个例子都有效。但是,如果在文件中创建ruby类,加载文件并执行代码,它就会爆炸。请参阅以下示例:

class MyConcatenationTest
  def self.test
    '' << 233
    '' << 256
  end
end

然后在IRB:

load 'my_concatenation_test.rb'  #=> true
MyConcatenationTest.test         #=> RangeError: 256 out of char range

所以,我的问题是:为什么这在IRB中有效,但在我加载运行相同代码行的脚本时却没有?

如果你改变了课程,还有其他注意事项:

class MyConcatenationTest
  def self.test
    '' << 233
    #'' << 256
  end
end

...然后重新加载/运行该方法,它返回233的\ x转义值而不是之前的“é”:

load 'my_concatenation_test.rb'
MyConcatenationTest.test          #=> "\xE9"

那么......那是什么?两个字符串都具有相同的编码(UTF-8),将其更改为ASCII似乎没有任何区别。

编辑:我应该提一下,我在上面的例子中使用了256,因为它是它爆炸的最低数字。很明显它很吓人,因为它无法正确处理高于“\ xFF”的任何事情。为了澄清我的问题,我很想知道当代码存在于加载的ruby文件中时,为什么存在这种限制,而不是在IRB中。

1 个答案:

答案 0 :(得分:3)

你使用哪种红宝石版本?这可能是因为在ruby 1.9(及更早版本)中,UTF-8不是默认编码。

将文件修改为以下内容建议ruby使用UTF-8来解析文件。

# ~coding: utf-8
class MyConcatenationTest
  def self.test
    '' << 233
    '' << 256
  end
end

如果您在ruby 2.0中执行该文件,它将按预期工作,而不是the magic comment,因为UTF-8是ruby 2.0中的默认编码。

为什么它在irb中工作(即使使用ruby 1.9.3)?

irb使用$LANG环境变量来确定应使用哪种编码。我的(也许是你的?)$LANG设置为en_US.UTF-8,这使irb使用UTF-8编码。

您可以使用irb(或其他一些编码)开始irb -EISO-8859-1来更改该内容。

$ irb -EISO-8859-1 # start irb with ISO-8859-1 encoding
irb(main):001:0> "".encoding
=> #<Encoding:ISO-8859-1>