检查字符串是否在Ruby中包含表情符号

时间:2020-04-03 18:17:28

标签: ruby-on-rails ruby

在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的原因是因为根据this site,看来所有表情符号(或大多数表情符号)都是以此签名开头的。

但是这不起作用。即使为true,它也会继续返回false。我可以肯定的问题是我的include语句不起作用,因为表情符号没有转换为用于比较的字节。

问题 我如何进行验证以检查表情符号没有传入?

  • UTF8中笑脸的示例字节:\xF0\x9F\x99\x82

1 个答案:

答案 0 :(得分:5)

您可以使用Emoji Unicode属性使用Regexp来测试表情符号,如下所示:

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

Unicode® Technical Standard #51 "UNICODE EMOJI"包含一个more sophisticated regex

\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中实现。]

但是,检查表情符号可能还不够。很明显,您的文本处理在某种程度上已中断。而且,如果它被表情符号破坏了,那么它也有可能被我的名字,Ruby的创建者松本行弘的名字或完全正常的英语单词“naïve”破坏。

与其玩游戏来尝试检测每个表情符号,数学符号,阿拉伯字母,印刷正确的标点符号等,不如简单地修正文本处理会更好。