Проверьте, содержит ли строка Emoji в Ruby - PullRequest
1 голос
/ 03 апреля 2020

В ruby, вот как вы можете проверить подстроку в строке:

str = "hello world"
str.include?("lo")
=> true

Когда я пытаюсь сохранить эмодзи в текстовом столбце в приложении rails (текстовый столбец в базе данных mysql это utf8), он возвращается с этой ошибкой:

Неверное строковое значение: \ xF0 \ x9F \ x99 \ x82

Для В моей ситуации с приложением rails достаточно посмотреть, есть ли смайлики в представленном тексте. Если присутствует смайлик: выдайте ошибку проверки. Пример:

class MyModel < ApplicationRecord
  validate :cannot_contain_emojis

  private

  def cannot_contain_emojis
    if my_column.include?("/\xF0")
      errors.add(:my_column, 'Cannot include emojis")
    end 
  end
end

Примечание: Причина, по которой я проверяю \xF0, заключается в том, что согласно этому сайту , кажется, что все или большинство эмодзи Начните с этой подписи.

Это, однако, не работает. Он продолжает возвращать false, даже когда это правда. Я почти уверен, что проблема в том, что моя инструкция включения не работает, потому что эмодзи не преобразуется в байты для сравнения.

Вопрос Как я могу сделать проверку, чтобы проверить, что смайлики не передаются?

  • Пример байтов для смайлика в UTF8: \xF0\x9F\x99\x82

1 Ответ

4 голосов
/ 03 апреля 2020

Вы можете использовать свойство Emoji Unicode для проверки Emoji, используя Regexp, что-то вроде этого:

def cannot_contain_emojis
  if /\p{Emoji}/ =~ my_column
    errors.add(:my_column, 'Cannot include emojis')
  end 
end

Технический стандарт Unicode® # 51 «UNICODE EMOJI» содержит более сложное регулярное выражение :

\p{RI} \p{RI} 
| \p{Emoji} 
  ( \p{EMod} 
  | \x{FE0F} \x{20E3}? 
  | [\x{E0020}-\x{E007E}]+ \x{E007F} )?
  (\x{200D} \p{Emoji}
    ( \p{EMod} 
    | \x{FE0F} \x{20E3}? 
    | [\x{E0020}-\x{E007E}]+ \x{E007F} )?
  )*

[Примечание: некоторые из этих свойств не реализованы в Onigmo / Ruby.]

Однако проверки на Emojis, вероятно, будет недостаточно. Совершенно очевидно, что ваша обработка текста в какой-то момент нарушается. И если он сломан эмодзи, то есть вероятность, что он также будет сломан моим именем или именем создателя Ruby 松本 行 弘, или совершенно нормальным английским sh словом «наивный».

Вместо того, чтобы играть в игру «бей-моль», пытаясь обнаружить каждый эмодзи, математический символ, букву арабского языка c, типографски правильный знак пунктуации и т. Д. c., Было бы гораздо лучше просто исправить обработку текста.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...