Рубиновый пробел не равен пробелу - PullRequest
0 голосов
/ 30 августа 2018

В следующих инструкциях один из пробелов взят из ввода пользователя (я скопировал символ пользователя из удаленной консоли Rails (поле ActiveRecord) и вставил его), а другой - из моей клавиатуры. Операторы возвращают false:

" " == " " # => false
" ".include? " " # => false

Есть идеи о том, почему / как это может происходить?

Ответы [ 2 ]

0 голосов
/ 30 августа 2018

Полагаю, вы можете использовать String # unicode_normalize . Он имеет несколько форм нормализации, которые задокументированы на unicode.org . Похоже, :nfkc и :nfkd подходят для этой цели.

s = "foo bar" # <-- includes a non breaking space
space = " "   # <-- regular space

s.include?(space)                          # => false
s.unicode_normalize(:nfkc).include?(space) # => true
0 голосов
/ 30 августа 2018

Чтобы проверить ввод пользователя для пустота , не следует использовать помощники == и / или include?. Нужно использовать современное регулярное выражение, которое соответствует пробелам .

К вашему сведению: в спецификациях UTF-8 содержится более десяти пробельных символов, включая, но не ограничиваясь:

spaces = {
  space_medium_mathematical_space: " ",
  spaces_em_quad: " ",
  spaces_em_space: " ",
  spaces_en_quad: " ",
  spaces_en_space: " ",
  spaces_figure_space: " ",
  spaces_four_per_em_space: " ",
  spaces_hair_space: " ",
  spaces_punctuation_space: " ",
  spaces_six_per_em_space: " ",
  spaces_thin_space: " ",
  spaces_three_per_em_space: " "
}

Чтобы соответствовать им, используется \p{Space} matcher.

spaces.values.map { |s| s == ' ' }
#⇒ [false, false, false, false, false, false,
#   false, false, false, false, false, false]

Но:

spaces.values.map(&/\A\p{Space}*\z/.method(:match?))
#⇒ [true, true, true, true, true, true,
#   true, true, true, true, true, true]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...