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:为什么不用正则表达式
  • 8b86d7292df9:当输入≤ 或者 ≥ 也被认为是表情。
  • 吴德馨:方法1一直会报currentInputMode的警告,有什么办法去掉警告又保留禁止表情输入的效果的办法吗?
  • 82ba2c1f6654: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