Как извлечь отдельный символ (в виде строки) из строки большего размера в Ruby? - PullRequest
16 голосов
/ 16 декабря 2008

Что такое идиоматический способ Ruby для извлечения одного символа из строки в виде строки из одного символа? Конечно, есть метод str[n], но (начиная с Ruby 1.8) он возвращает код символа как fixnum, а не строку. Как добраться до односимвольной строки?

Ответы [ 5 ]

20 голосов
/ 17 декабря 2008

В Ruby 1.9 это легко. В Ruby 1.9 строки представляют собой последовательности символов с кодировкой, так что вы можете просто проиндексировать их и получить из них односимвольную строку:

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

Однако в Ruby 1.8 строки представляют собой последовательности байтов и, следовательно, совершенно не знают о кодировке. Если вы индексируете в строку, и эта строка использует многобайтовую кодировку, вы рискуете индексировать прямо в середину многобайтового символа (в этом примере «µ» кодируется в UTF-8):

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

Однако Regexps и некоторые специализированные строковые методы поддерживают как минимум небольшое подмножество популярных кодировок, среди которых некоторые японские кодировки (например, Shift-JIS) и (в этом примере) UTF-8:

'µsec'.split('')[0] # => 'µ'
'µsec'.split(//u)[0] # => 'µ'
14 голосов
/ 16 декабря 2008

До Ruby 1.9:

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

Рубин 1.9 +:

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

У лота изменилось в Ruby 1.9, включая семантика строк .

7 голосов
/ 16 декабря 2008

Должно работать на Ruby до и после 1.9:

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

Пожалуйста, смотрите комментарий Йорг Миттаг: это верно только для однобайтовых наборов символов.

1 голос
/ 16 декабря 2008
'abc'[1..1] # => "b"
0 голосов
/ 16 декабря 2008
'abc'[1].chr # => "b"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...