【问题标题】:How to extract a single character (as a string) from a larger string in Ruby?如何从Ruby中的较大字符串中提取单个字符(作为字符串)?
【发布时间】:2008-12-16 13:43:22
【问题描述】:

从字符串中检索单个字符作为单字符字符串的 Ruby 惯用方法是什么?当然有str[n] 方法,但是(从Ruby 1.8 开始)它返回一个字符代码作为一个fixnum,而不是一个字符串。你如何得到一个单字符的字符串?

【问题讨论】:

标签: ruby


【解决方案1】:

在 Ruby 1.9 中,这很容易。在 Ruby 1.9 中,字符串是可识别编码的字符序列,因此您只需对其进行索引,就可以从中得到一个单字符的字符串:

'µsec'[0] => 'µ'

然而,在 Ruby 1.8 中,字符串是字节序列,因此完全不知道编码。如果您对字符串进行索引并且该字符串使用多字节编码,则您可能会在多字节字符的中间进行索引(在此示例中,“µ”以 UTF-8 编码):

'µsec'[0] # => 194
'µsec'[0].chr # => Garbage
'µsec'[0,1] # => Garbage

但是,正则表达式和一些专门的字符串方法至少支持一小部分流行的编码,其中包括一些日文编码(例如 Shift-JIS)和(在本例中)UTF-8:

'µsec'.split('')[0] # => 'µ'
'µsec'.split(//u)[0] # => 'µ'

【讨论】:

  • 如果您在 Ruby 1.8 中使用多字节,您应该使用适当的字符处理程序类(例如 Active Support 的 UTF8Handler),而不是尝试提出愚蠢的 hack,因为您会遇到同样的问题reverse/strip/downcase/slice/etc 因为字符串是字节数组。
【解决方案2】:

在 Ruby 1.9 之前:

'Hello'[1].chr  # => "e"

Ruby 1.9+:

'Hello'[1]  # => "e"

Ruby 1.9 中有很多 changed,包括 string semantics

【讨论】:

  • 因为字符的概念在 1.9 中发生了变化,这是一个重要的变化......
  • 第一个不行。在 Ruby 1.9 之前的版本中,字符串是字节序列,而不是字符。如果您的字符串具有多字节编码,您将直接索引到多字节字符的中间。
  • 问题是在 Ruby 1.8 中对多字节字符串的支持非常参差不齐,这也可以在该语言的许多其他领域看到,例如 'µsec'.reverse 不能很好地工作。
【解决方案3】:

应该在 Ruby 1.9 之前和之后工作:

'Hello'[2,1]  # => "l"

请参阅 Jörg Mittag 的评论:这仅适用于单字节字符集。

【讨论】:

  • 这在 Ruby 1.8 或更早版本中不起作用。在 Ruby 1.9 之前的版本中,字符串是字节序列,而不是字符。如果您的字符串具有多字节编码,您将直接索引到多字节字符的中间。
【解决方案4】:
'abc'[1..1] # => "b"

【讨论】:

  • 这在 Ruby 1.8 或更早版本中不起作用。在 Ruby 1.9 之前的版本中,字符串是字节序列,而不是字符。如果您的字符串具有多字节编码,您将直接索引到多字节字符的中间。
【解决方案5】:
'abc'[1].chr # => "b"

【讨论】:

  • 这在 Ruby 1.8 或更早版本中不起作用。在 Ruby 1.9 之前的版本中,字符串是字节序列,而不是字符。如果您的字符串具有多字节编码,您将直接索引到多字节字符的中间。
猜你喜欢
  • 1970-01-01
  • 2022-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-23
  • 2016-11-05
  • 2012-03-03
  • 1970-01-01
相关资源
最近更新 更多