项目有这个需求,网上找了很多,大部分表情都能限制,但是总有一些漏网之鱼,类似 ❤️这个.最后在github上找到了一个2016年作者写的,竟然能全部屏蔽掉,链接,这个里面好几个方法,我使用到的是判断字符串是否为emoji
注意:方法和百度来的很类似,但里面实际有一些不一样的,可以试一下
+ (BOOL)stringContainsEmoji:(NSString *)string
{
// 过滤所有表情。returnValue为NO表示不含有表情,YES表示含有表情
__block BOOL containsEmoji = NO;
[string enumerateSubstringsInRange:NSMakeRange(0, [string length]) options:NSStringEnumerationByComposedCharacterSequences usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop) {
const unichar hs = [substring characterAtIndex:0];
// surrogate pair
if (0xd800 <= hs &&
hs <= 0xdbff)
{
if (substring.length > 1)
{
const unichar ls = [substring characterAtIndex:1];
const int uc = ((hs - 0xd800) * 0x400) + (ls - 0xdc00) + 0x10000;
if (0x1d000 <= uc &&
uc <= 0x1f9c0)
{
containsEmoji = YES;
}
}
}
else if (substring.length > 1)
{
const unichar ls = [substring characterAtIndex:1];
if (ls == 0x20e3 ||
ls == 0xfe0f ||
ls == 0xd83c)
{
containsEmoji = YES;
}
}
else
{
// non surrogate
if (0x2100 <= hs &&
hs <= 0x27ff)
{
containsEmoji = YES;
}
else if (0x2B05 <= hs &&
hs <= 0x2b07)
{
containsEmoji = YES;
}
else if (0x2934 <= hs &&
hs <= 0x2935)
{
containsEmoji = YES;
}
else if (0x3297 <= hs &&
hs <= 0x3299)
{
containsEmoji = YES;
}
else if (hs == 0xa9 ||
hs == 0xae ||
hs == 0x303d ||
hs == 0x3030 ||
hs == 0x2b55 ||
hs == 0x2b1c ||
hs == 0x2b1b ||
hs == 0x2b50)
{
containsEmoji = YES;
}
}
if (containsEmoji)
{
*stop = YES;
}
}];
return containsEmoji;
}
这个判断下有个问题是九宫格输入法直接是不能输入内容的,所以还需要再判断一下是否为九宫格输入法,判断方法:
+(BOOL)isNineKeyBoard:(NSString *)string
{
NSString *other = @"➋➌➍➎➏➐➑➒";
int len = (int)string.length;
for(int i=0;i<len;i++)
{
if(!([other rangeOfString:string].location != NSNotFound))
return NO;
}
return YES;
}