zoukankan      html  css  js  c++  java
  • 去除服务器不能识别的表情符号 -- 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 ]";

        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] = '';

        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;

    }

  • 相关阅读:
    BZOJ3575 [Hnoi2014]道路堵塞
    BZOJ4456/UOJ184 [Zjoi2016]旅行者
    BZOJ4455/UOJ185 [Zjoi2016]小星星
    BZOJ1036 [ZJOI2008]树的统计Count
    BZOJ2594 [Wc2006]水管局长数据加强版
    BZOJ3669/UOJ3 魔法森林(LCT)
    BZOJ1012:[JSOI2008]最大数
    洛谷【P1175】表达式的转换
    HDU4699:Editor
    BZOJ3039:玉蟾宫
  • 原文地址:https://www.cnblogs.com/wj0920wjx/p/8807324.html
Copyright © 2011-2022 走看看