新项目必须对客户键入的emoji神情开展过虑,以前对于系统软件的emoji神情全是用unicode编号集分辨的,可是伴随着iOS系统软件的emoji神情愈来愈丰富多彩,以前的分辨就变得乏力了,再再加上第三方搜狗搜索和百度输入法的掺和,乃至是不一样iOS系统软件的 API分辨都不一样,因此必须再次发布一下分辨的办法了。

通过剖析得到,在iOS14和iOS12系统软件上,对于

if (![[textView textInputMode] primaryLanguage] || [[[textView textInputMode] primaryLanguage] isEqualToString:@"emoji"] ) {        return NO;    }

这一api回到的结论不一致,iOS12回到的为emoji而iOS14的为zh-Hans。

融合搜狗和iOS系统软件电脑键盘开展剖析得到。在输入法中填写的emoji字符串数组全是2个长短,而iOS系统软件的有的乃至做到了11个长短(选用了标识符组成),因而当对于长短为不大于2的情况下用一下方式:

if(string.length <= 2){        NSString *pattern = @"[^\\u0020-\\u007E\\u00A0-\\u00BE\\u2E80-\\uA4CF\\uF900-\\uFAFF\\uFE30-\\uFE4F\\uFF00-\\uFFEF\\u0080-\\u009F\\u2000-\\u201f\r\n]";        NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", pattern];        BOOL isMatch = [pred evaluateWithObject:string];        return isMatch;    }

这类对于非组成emoji分辨通过很多认证能够符合条件。

检索电脑输入法和百度输入法有一个独特作用,点一下标记-互联网的过程中能够发长文字,比如:https:// www 这些。可是发觉真真正正的emoji转为unicode标识符的情况下是十分有周期性的,例如:\u0020\u007E,每一个符号表情由6个uncode标识符构成。原本可以用正则表达式开展字符串匹配,可是无可奈何不交流会啊!下边贴上详细编码。

详细方式

/**是不是第三方的神情*/ (BOOL)hasEmoji:(NSString*)string{    NSString *other = @"➋➌➍➎➏➐➑➒"; //iPhone的系统软件九宫格的特殊符号    if([other rangeOfString:string].location != NSNotFound){        return NO;    }    NSString *pattern = @"[^\\u0020-\\u007E\\u00A0-\\u00BE\\u2E80-\\uA4CF\\uF900-\\uFAFF\\uFE30-\\uFE4F\\uFF00-\\uFFEF\\u0080-\\u009F\\u2000-\\u201f\r\n]";    NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", pattern];    BOOL isMatch = [pred evaluateWithObject:string];    if(isMatch){        return YES;    }    ._block BOOL returnValue = 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  1) {                 const unichar ls = [substring characterAtIndex:1];                 const int uc = ((hs - 0dxd800) * 0x400)   (ls - 0xdc00)   0x10000;                 //129500-129503 探索与发现的一些符号表情                 //129305-129342                 //129402-129499                 if( (0x1d000 <= uc && uc <= 0x1f77f) ||                    (129305 <= uc && uc <= 129342) ||                    (129402 <= uc && uc <= 129499) ||                    (129500 <= uc && uc  1) {             const unichar ls = [substring characterAtIndex:1];             if (ls == 0x20e3 || ls == 0xfe0f || ls == 0xd83c || ls == 0xfe0e) {                 returnValue = YES;             }         } else {             // non surrogate             if (0x2100 <= hs && hs <= 0x27ff) {                 returnValue = YES;             } else if (0x2B05 <= hs && hs <= 0x2b07) {                 returnValue = YES;             } else if (0x2934 <= hs && hs <= 0x2935) {                 returnValue = YES;             } else if (0x3297 <= hs && hs <= 0x3299) {                 returnValue = YES;             } else if (hs == 0xa9 || hs == 0xae || hs == 0x303d || hs == 0x3030 || hs == 0x2b55 || hs == 0x2b1c || hs == 0x2b1b || hs == 0x2b50 || hs == 0xfe45 || hs == 0xfe46) {                 returnValue = YES;             }         }     }];    return returnValue;}

再度检测后沒有发觉一切难题,期待小伙伴们检测的情况下发觉有什么问题还记得留言板留言call我。感谢!!!