在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语句不起作用,因为表情符号没有转换为用于比较的字节。
问题 我如何进行验证以检查表情符号没有传入?
\xF0\x9F\x99\x82
答案 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”破坏。
与其玩游戏来尝试检测每个表情符号,数学符号,阿拉伯字母,印刷正确的标点符号等,不如简单地修正文本处理会更好。