iOS判断、过滤和禁用emoji表情

作者: 黄二瓜 | 来源:发表于2015-12-18 13:46 被阅读14946次

    最近项目中碰到的问题,在发送网络请求时,由于用户输入了emoji表情,服务端返回错误提示信息。为了解决服务器不能验证emoji编码的问题,需要在本地进行emoji的输入控制(正常情况下应该由服务器在数据库中添加emoji对应的转码表以支持客户端发送emoji表情),在网上搜了下iOS端解决办法如下:

    1.当用户切换键盘为Emoji表情时,输入的表情不响应(即表情符号不显示到UITextView或UITextField)。这里可以通过UITextView或UITextField的回调和是否为emoji键盘:

    [[[textView textInputMode] primaryLanguage] isEqualToString:@"emoji"]
    
    - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{
        
        //不支持系统表情的输入
        if ([[[UITextInputMode currentInputMode ]primaryLanguage] isEqualToString:@"emoji"]) {
            return NO;
        }
        return YES;
    }
    

    2.通过过滤用户输入的emoji来实现

    //过滤表情
    + (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;
    }
    
    

    3.通过判断用户输入的字符串时候含有表情来进行对应的操作

    //是否含有表情
    + (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];
                                    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 {
                                        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;
    }
    

    参考地址:http://www.faceye.net/search/90801.html

    相关文章

      网友评论

      • 吴德馨:非常感谢!再加上联想输入的表情限制就完美了
      • 黑白灰的绿i:最后一个方法 九格键盘也不行
      • ff567a254ab5:为什么不用正则表达式
      • 梦之路:当输入≤ 或者 ≥ 也被认为是表情。
      • 吴德馨:方法1一直会报currentInputMode的警告,有什么办法去掉警告又保留禁止表情输入的效果的办法吗?
      • nihaoshijie:emoji在NSUTF8StringEncoding编码下占用4个字节,中文编码占用3个字节
        可根据
        - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
        中依据
        NSUInteger stringUtf8Length = [string lengthOfBytesUsingEncoding:NSUTF8StringEncoding];
        if(stringUtf8Length >= 4 && (stringUtf8Length / string.length != 3)) {
        return NO;
        }判断
        可排出大多数表情符号,还有少量的符号排除不了,比如^_^ ,占3个字符。

        代码不实用在九宫格键盘上的,可以在输入时打断点查看内容或直接输出%x查看。
        zixiao0306:@nihaoshijie 这个方法下,用中文键盘打出的英文单次也被过滤掉了,请问一下该怎样处理?
      • f1cfeb3cb646:你好 请问遇到过ios9给ios10发送emoji表情 ios无法正常显示的问题吗?
      • 琪一可:你好 我想问一下 向后台传送emoji表情的话 需要做特别的处理吗 不能用textField.text给后台吗。 需要怎么处理呢
      • SJTom:第三种方法 有遗漏的表情 uc 数值更大的 表情 就没有 return YES
        d6c13059b1e9: :flushed: :relaxed: :relaxed: fdifdisfdsjifdsiji
        l富文本l:@SJTom 兄弟第三种方法有更全的吗?我碰到了
        90年代的小伙子:@SJTom 哥们第三种方法你有更全的么,我也遇见了
      • AmdyTeng:表情过滤还是有遗漏的表情啊?
      • 6c0d9a5f40be:[UITextInputMode currentInputMode ]方法在iOS7.0以上就被禁掉啰
      • 与世倾听X游定终生:传入的字符串+表情字符,判断之后返回的字符和之前的完全不一样,顺便说一下,我是传的中文字符串
      • 与世倾听X游定终生:你这个表情过滤不行啊
        与世倾听X游定终生:@阿拉拉 是的,返回的都是数字
        阿拉拉:@黄二峰 表情过滤不掉,得出的都是数字
        黄二瓜:@与世倾听X游定终生 具体在哪里不行?

      本文标题:iOS判断、过滤和禁用emoji表情

      本文链接:https://www.haomeiwen.com/subject/pypphttx.html