项目需要对用户输入的绘文字表情进行过滤,之前针对系统的绘文字表情都是用采用双字节对字符进行编码编码集判断的,但是随着ios系统的绘文字表情越来越丰富,之前的判断就显得无力了,再加上第三方搜狗和百度输入法的掺合,甚至是不同ios系统的应用程序接口判断都不一样,所以有必要重新更新一下判断的方法了。
经过分析得出,在iOS14和iOS12系统上,针对
if(![[textView text input mode]主语言]| |[[textView text input mode]主语言]isequaltostring : @ ' emoji ']){ 0
返回否;
}
这个美国石油学会(美国石油协会)返回的结果不一致,iOS12返回的为绘文字而iOS14的为汉斯。
结合搜狗输入法和ios系统键盘进行分析得出。在搜狗输入法中输入的绘文字字符串都是2个长度,而ios系统的有的甚至达到了11个长度(采用了字符组合),因此当针对长度为小于等于2的时候用一下方法:
if(字符串。长度=2){ 0
nsstring * pattern=@'[^\\u0020-\\u007e\\u00a0-\\u00be\\u2e80-\\ua4cf\\uf900-\\ufaff\\ufe30-\\ufe4f\\uff00-\\uffef\\u0080-\\u009f\\u2000-\\u201f\r\n]';
NSPredicate * pred=[NSPredicate pretewith format : @ ' SELF MATCHES % @ ',pattern];
BOOL Ismatch=[pred evaluatewithObject :字符串];
返回伊斯马特
}
这种针对非组合绘文字判断经过大量验证可以满足条件。
搜索输入法和百度输入法有个特殊功能,点击符号-网络的时候可以发长文本,例如:https://www等等。但是发现真正的绘文字转成采用双字节对字符进行编码字符的时候都是非常有规律的,比如:
\u0020\u007E,每个表情符号由6个未编码字符组成。本来可以用正则进行字符串匹配,但是无奈不大会啊!下面贴上完整代码。
完整方法
/**是否第三方的表情*/
(BOOL)hasemoji3360(NSString *)字符串
{
NSString * other=@//苹果的系统九宫格的特殊字符
如果([其他字符串范围:string].位置!=NSnotFounded){ 0
返回否;
}
nsstring * pattern=@'[^\\u0020-\\u007e\\u00a0-\\u00be\\u2e80-\\ua4cf\\uf900-\\ufaff\\ufe30-\\ufe4f\\uff00-\\uffef\\u0080-\\u009f\\u2000-\\u201f\r\n]';
NSPredicate * pred=[NSPredicate pretewith format : @ ' SELF MATCHES % @ ',pattern];
BOOL Ismatch=[pred evaluatewithObject :字符串];
if(IsMatch){ 0
返回是;
}
__block BOOL返回值=否;
[字符串枚举实体化范围: smakrange(0,[字符串长度])选项3360 sstringnumerationby composedcharactersseries使用块:
^(NSString *substring,NSRange substringRange,NSRange enclosingRange,bool * stop){ 0
const unichar hs=[子字符串字符atin dex :0];
//代理项对
if(0x d 800=hs hs hs=0x dbff){ 0
if(子字符串。长度1){ 0
const uni char ls=[substring char at index :1];
const int UC=((hs-0dxd 800)*0x 400)(ls-0x DC 00)0x 10000;
//129500-129503 新发现的一些表情符号
//129305-129342
//129402-129499
if((0x1d000=uc uc=0x1f77f) ||
(129305=UC UC UC=129342)| |
(129402=UC UC UC=129499)| |
(129500=UC UC UC=129503)){ 0
返回值=是;
}
}
} else if(子字符串。长度){ 1
const uni char ls=[substring char at index :1];
if(ls==0x20e 3 | | ls==0xfe 0f | | ls==0xd 83c | | ls==0xfe 0e){ 0
返回值=是;
}
} else {
//非代理
if(0x 2100=hs hs hs=0x 27 ff){ 0
返回值=是;
}否则if(0x2b 05=hs hs hs=0x2b 07){ 0
返回值=是;
}否则if(0x 2934=hs hs hs=0x 2935){ 0
返回值=是;
}否则if(0x 3297=hs hs hs=0x 3299){ 0
返回值=是;
} else if(hs==0xa 9 | | hs==0xa e | | hs==0x 303d | | hs==0x 3030 | | hs==0x2b 55 | | hs==0x2b 1c | | hs==0x2b 1b | | hs==0x2b 50 | | hs==0x Fe 45 | | hs==0x Fe 46){ 0
返回值=是;
}
}
}];
返回返回值
}
再次测试后没有发现任何问题,希望小伙伴测试的时候发现有问题记得留言呼叫我。谢谢!