неправильное поведение метода (возможно в зависимости от кодировки) - PullRequest
2 голосов
/ 07 октября 2011

Я получил странное поведение от ruby ​​(в irb):

irb(main):002:0> pp "    LS 600"
"\302\240\302\240\302\240\302\240LS 600"

irb(main):003:0> pp "    LS 600".strip
"\302\240\302\240\302\240\302\240LS 600"

Это означает (для тех, кто не понимает), что метод strip вообще не влияет на эту строку, то же самое с gsub('/\s+/', '')

Как я могу удалить эту строку (я получил ее при разборе интернет-страницы)?

1 Ответ

6 голосов
/ 07 октября 2011

Строка "\302\240" является строкой в ​​кодировке UTF-8 (C2 A0) для кодовой точки Unicode A0, которая представляет символ пробела без пробелов.Есть много других символов пространства Юникода.К сожалению, метод String#strip не удаляет ничего из этого.

Если вы используете Ruby 1.9.2, то вы можете решить эту проблему следующим образом:

# Ruby 1.9.2 only.
# Remove any whitespace-like characters from beginning/end.
"\302\240\302\240LS 600".gsub(/^\p{Space}+|\p{Space}+$/, "")

В поддержке Ruby 1.8.7Юникод не так хорош.Вы можете быть успешным, если вы можете зависеть от ActiveSupport::Multibyte Rails.Это дает преимущество в том, что вы получаете работающий метод strip бесплатно.Установите ActiveSupport с gem install activesupport и попробуйте следующее:

# Ruby 1.8.7/1.9.2.
$KCODE = "u"
require "rubygems"
require "active_support/core_ext/string/multibyte"

# Remove any whitespace-like characters from beginning/end.
"\302\240\302\240LS 600".mb_chars.strip.to_s
...