去除服务器不能识别的表情符号 -- iOS

-(BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text{

    if ([textView isFirstResponder]) {

        

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

            return NO;

        }

        

        //判断键盘是不是九宫格键盘

        if ([self isNineKeyBoard:text] ){

            return YES;

        }else{

            if ([self hasEmoji:text] || [self stringContainsEmoji:text]){

                return NO;

            }

        }

    }

    return YES;

}

 

/**

 判断是不是九宫格

 @param string  输入的字符

 @return YES(是九宫格拼音键盘)

 */

-(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;

}

 

/**

 *  判断字符串中是否存在emoji == 亲测并不能过滤所有的表情,但是大多数表情是可以被过滤掉的,不能过滤的表情可以正常上传服务器

 * @param string 字符串

 * @return YES(含有表情)

 */

- (BOOL)hasEmoji:(NSString*)string;

{

    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;

}

 

//过滤表情

- (NSString *)filterEmoji:(NSString *)string {

    NSUInteger len = [string lengthOfBytesUsingEncoding:NSUTF8StringEncoding];

    const char *utf8 = [string UTF8String];

    char *newUTF8 = malloc( sizeof(char) * len );

    int j = 0;

    

    //0xF0(4) 0xE2(3) 0xE3(3) 0xC2(2) 0x30---0x39(4)

    for ( int i = 0; i < len; i++ ) {

        unsigned int c = utf8;

        BOOL isControlChar = NO;

        if ( c == 4294967280 ||

            c == 4294967089 ||

            c == 4294967090 ||

            c == 4294967091 ||

            c == 4294967092 ||

            c == 4294967093 ||

            c == 4294967094 ||

            c == 4294967095 ||

            c == 4294967096 ||

            c == 4294967097 ||

            c == 4294967088 ) {

            i = i + 3;

            isControlChar = YES;

        }

        if ( c == 4294967266 || c == 4294967267 ) {

            i = i + 2;

            isControlChar = YES;

        }

        if ( c == 4294967234 ) {

            i = i + 1;

            isControlChar = YES;

        }

        if ( !isControlChar ) {

            newUTF8[j] = utf8;

            j++;

        }

    }

    newUTF8[j] = '\0';

    NSString *encrypted = [NSString stringWithCString:(const char*)newUTF8 encoding:NSUTF8StringEncoding];

    free( newUTF8 );

    return encrypted;

}

 

/**

 *  判断字符串中是否存在emoji

 * @param string 字符串

 * @return YES(含有表情)

 */

- (BOOL)stringContainsEmoji:(NSString *)string {

    

    __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 <= 0xdbff) {

             if (substring.length > 1) {

                 const unichar ls = [substring characterAtIndex:1];

                 const int uc = ((hs - 0xd800) * 0x400) + (ls - 0xdc00) + 0x10000;

                 if (0x1d000 <= uc && uc <= 0x1f77f) {

                     returnValue = YES;

                 }

             }

         } else if (substring.length > 1) {

             const unichar ls = [substring characterAtIndex:1];

             if (ls == 0x20e3) {

                 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) {

                 returnValue = YES;

             }

         }

     }];

    return returnValue;

}

 

posted @ 2018-04-12 13:45  wj0920wjx  阅读(561)  评论(0编辑  收藏  举报