В следующих инструкциях одно из пробелов получено из ввода пользователя (я скопировал символ пользователя с удаленной консоли Rails (поле ActiveRecord) и вставил его), а другой - с моей клавиатуры. Операторы возвращают false:
" " == " " # => false
" ".include? " " # => false
Есть идеи, почему / как это может происходить?
UTF-8 или непечатаемые символы, возможно. То, что это выглядит как пространство, не означает, что это так. Еще одна причина никогда не доверять пользовательскому вводу!
Себастьян, вот и все, я подумал, что это какая-то проблема с кодировкой. Спасибо.
Невозможно воспроизвести.
Синтаксический анализатор @sawa SO преобразует любое пространство в обычный ASCII, поэтому нет возможности правильно вставить его сюда. Хотя, вопрос описан хорошо.
@mudasobwa Понятно.
@sawa извините, не какой пробел :) только nbsp. Пробелы в моем ответе сохранены. Я заменю OP на один из них, чтобы проблема была воспроизводимой. → готово, теперь это воспроизводимо.

Чтобы проверить ввод данных пользователем для пустота, не следует использовать помощники == и / или 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}.
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]
Предупреждение Nitpick: вы имели в виду спецификации Unicode. UTF-8 этого не говорит, например 8200 - это пробел, просто для его представления следует использовать байты 226, 128 и 136.
@ Амадан действительно. FWIW: приведенный выше фрагмент пробелов взят из моего любимого проекта Elixir StringNaming, где я анализирую unicode.org/Public/10.0.0/ucd/NamesList.txt из спецификаций Unicode, чтобы получить имена и значения.
Я считаю, что вы можете использовать Строка # 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
Попробуйте проверить их
[" ".ord, " ".ord], если вы получите[32, 160], у вас есть пробел и неразрывный пробел.