UITextView/UITextField检测并过滤Emoji表情符号

简介: UITextView/UITextField检测并过滤Emoji表情符号

UITextView/UITextField检测并过滤Emoji表情符号


本人在开发过程中遇到过这种情况,服务器端不支持Emoji表情,因此要求客户端在上传用户输入时,不能包含Emoji表情。在客户端发送请求前,判断用户输入中是否含有表情,如果含有表情,则提示用户重新输入。这个过程关键是如何判断字符串中是否含有Emoji表情。


经过多番查找资料和测试Demo,目前有以下两种方式比较合理:


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

/*
 *第一种方法,简单粗暴
 */
 - (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
 {
     // 不让输入表情
     if ([textView isFirstResponder]) {
         if ([[[textView textInputMode] primaryLanguage] isEqualToString:@"emoji"] || ![[textView textInputMode] primaryLanguage]) {
             NSLog(@"输入的是表情,返回NO");
             UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"警告!" message:@"不能输入表情" delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"确定",nil];
             [alertView show];
             return NO;
         }
     }
     return YES;
 }


  1. 为避免当用户通过中文键盘输入中文“哈哈”后出现可选文字中选中的Emoji笑脸,最后在- (void)textFieldDidEndEditing:(UITextField *)textField方法中统一通过检查最终字符串textField/textView.text的内容,通过Emoji筛unicode编码来判断是否存在Emoji表情,如果存在则提醒用户做修改。


//在输入完成时,调用下面那个方法来判断输入的字符串是否含有表情
 - (void)textFieldDidEndEditing:(UITextField *)textField
 {
     if ([self stringContainsEmoji:textField.text]) {
         NSLog(@"含有表情");
         UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"警告!" message:@"输入内容含有表情,请重新输入" delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"确定",nil];
         [alertView show];
         textField.text = @"";
         [textField becomeFirstResponder];
     }else {
         NSLog(@"不含有表情");
     }
 }
 /*
  *第二种方法,利用Emoji表情最终会被编码成Unicode,因此,
  *只要知道Emoji表情的Unicode编码的范围,
  *就可以判断用户是否输入了Emoji表情。
  */
 - (BOOL)stringContainsEmoji:(NSString *)string
 {
     // 过滤所有表情。returnValue为NO表示不含有表情,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 <= 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;
 }


ps:Demo已放在云盘里,链接: http://pan.baidu.com/s/1boguLgN 密码: keet


相关文章
|
测试技术 Swift
Swift:UILabel超出宽度文字的截取
Swift:UILabel超出宽度文字的截取
493 0
Swift:UILabel超出宽度文字的截取
要实现文字查询并自动滚动到匹配到的文本范围
要实现文字查询并自动滚动到匹配到的文本范围
|
2月前
给kprobe添加字符数据显示方式
给kprobe添加字符数据显示方式
|
6月前
|
移动开发
UITextView的attributedText含有NSTextAttachment对象、表情包和普通文本的遍历与组装h5字符串
UITextView的attributedText含有NSTextAttachment对象、表情包和普通文本的遍历与组装h5字符串
34 0
iOS-UITextView设置行间距,内容颜色(变相设置类似UITextField的placeholder)
iOS-UITextView设置行间距,内容颜色(变相设置类似UITextField的placeholder)
372 0
iOS-UITextView设置行间距,内容颜色(变相设置类似UITextField的placeholder)
NSString去掉html标签
NSString去掉html标签
252 0
SwiftUI—使用ScrollView在限定的区域显示超长的内容
SwiftUI—使用ScrollView在限定的区域显示超长的内容
428 0
SwiftUI—使用ScrollView在限定的区域显示超长的内容
|
数据安全/隐私保护
UGUI系列-InputField限制输入个数以及限制输入格式
UGUI InputField 组件是一个用来管理输入的组件 我们通常用来输入用户的账号,密码,或者聊天时输入文字,等等输入逻辑… 在使用中,我们常常要对输入的字符串进行限制,最常见的限制有个数和格式
如何更好的限制一个UITextField/UITextView的输入字数
要限制一个UITextField/UITextView的输入字数,首先想到的应该是通过UITextFieldDelegate/UITextViewDelegate 的代理方法来限制,那么如何来更好的限制输入字数呢,下面我们来看看:
|
JavaScript
Vue 输入框禁止输入非法字符,并查找非法字符的位置,显示出来
在vue中,禁止输入非法字符,并将非法字符标红显示
2246 0
Vue 输入框禁止输入非法字符,并查找非法字符的位置,显示出来