在提交数据发送网络请求,由于用户输入了emoji表情,服务端返回系统异常,体验感很差。为了解决服务器不能验证emoji编码的问题,需要在本地进行emoji的输入控制(一般情况应该由服务器在数据库中添加emoji对应的转码表以支持客户端发送emoji表情)。

所以就有了这个需求:在TextField或者TextView中,限制输入任何表情符号,(包括系统自带的表情,第三方键盘带的表情,还有某些汉字类型的表情)。

利用下面这个方法stringContainsEmoji可以限制系统键盘自带的表情

/**
*  判断字符串中是否存在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 pairif (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 surrogateif (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;
}

利用下面这个方法hasEmoji可以限制第三方键盘(常用的是搜狗键盘)的表情

/**
*  判断字符串中是否存在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;
}

利用下面这个方法hasEmoji可以限制第三方键盘(常用的是搜狗键盘)的表情

/**
*  判断字符串中是否存在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;
}

利用下面这个方法isNineKeyBoard可以判断当前是不是在使用九宫格输入

/**
判断是不是九宫格
@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;
}

下面就是现在UITextView禁止输入表情的重要代码,记得遵守代理~

#pragma mark -------UITextViewDelegate
-(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] || [GeneralMethods stringContainsEmoji:text]){return NO;}}}return YES;
}

UITextField在下面这个方法中写就行

#pragma mark -----UITextFieldDelegate
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{}

另外附上几个有用的方法:

//-----过滤字符串中的emoji
- (NSString *)disable_emoji:(NSString *)text {NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"[^\\u0020-\\u007E\\u00A0-\\u00BE\\u2E80-\\uA4CF\\uF900-\\uFAFF\\uFE30-\\uFE4F\\uFF00-\\uFFEF\\u0080-\\u009F\\u2000-\\u201f\r\n]"options:NSRegularExpressionCaseInsensitive error:nil];NSString *modifiedString = [regex stringByReplacingMatchesInString:textoptions:0range:NSMakeRange(0, [text length])withTemplate:@""];return modifiedString;
}
/**
* 判断 字母、数字、中文
*/
- (BOOL)isInputRuleAndNumber:(NSString *)str
{NSString *other = @"➋➌➍➎➏➐➑➒";     //九宫格的输入值unsigned long len=str.length;for(int i=0;i<len;i++){unichar a=[str characterAtIndex:i];if(!((isalpha(a))||(isalnum(a))
//             ||((a=='_') || (a == '-')) //判断是否允许下划线,昵称可能会用上||((a==' '))                 //判断是否允许空格||((a >= 0x4e00 && a <= 0x9fa6))||([other rangeOfString:str].location != NSNotFound)))return NO;}return YES;
}

注意:上面这种方法可以限制键盘输入任何表情符号,但是如果需求是必须要输入表情,而且要下次服务器把这个表情返回,还要回显到页面上,就要看下面这篇文章

链接:https://www.jianshu.com/p/2f5bb0a419fa

iOS限制输入表情(emoji)相关推荐

  1. iOStextField/textView在输入时限制emoji表情的输入

    https://www.jianshu.com/p/5227e6aab4d4 2017.02.27 13:08* 字数 146 阅读 6109评论 6喜欢 14 又遇到输入框输入表情的情况了,之前写了 ...

  2. android Emoji表情输入,输入表情和输入法表情输入相同

    首先我说一下我的大致经过,因为公司是做时尚类的所有表情的做法直接模仿了小红书和好,没有做全部的表情代码,只做了80个常用表情,表情图片自己去准备.因为设计刚好离职的缘故,所以自己偷懒,直接解压了nic ...

  3. iOS输入表情后系统异常

    解决方案有两种: 一:禁用表情,即限制用户不能输入表情.一般情况应该由服务器在数据库中添加emoji对应的转码表以支持客户端发送emoji表情. 在TextField或者TextView中,限制输入任 ...

  4. iOS计算输入字符数

    2019独角兽企业重金招聘Python工程师标准>>> iOS计算输入字符数 本文展示在iOS下,如何正确的计算输入的字符个数. 常见编码 汉字.中文符号 UTF-8编码下,一个汉字 ...

  5. 输入框限制输入表情的方法

    1.限制输入其他第三方的表情 //判断是否输入了emoji表情 + (BOOL)stringContainsEmoji:(NSString *)string{ __blockBOOL returnVa ...

  6. Android EditText限制输入表情和特殊符号的处理

    限制输入表情 public class EmojiEditText extends EditText {private Context mContext;public EmojiEditText (C ...

  7. java关于安卓,苹果输入表情数据库处理

    2019独角兽企业重金招聘Python工程师标准>>> 在APP开发中,大多需要涉及表情符号丰富APP的亲和力,但是因为我们的数据库一般是utf8编码,是3个字节,而表情符号基本都是 ...

  8. mysql 过滤emoji表情_过滤微信表情/emoji表情

    微信表情/emoji表情是个麻烦的东西,即使你能存储,也不一定能完美显示.在iOS以外的平台上,例如PC或者android.如果你需要显示emoji,就得准备一大堆emoji图片并使用第三方前端类库才 ...

  9. 匹配表情emoji 正则_详解Android过滤emoji表情正则表达式

    做了一些信息提交的操作,输入了Emoji表情时,后台数据库无法存储 原因:UTF-8编码有可能是两个.三个.四个字节.Emoji表情是4个字节,而Mysql的utf8编码最多3个字节,所以数据插不进去 ...

最新文章

  1. Android studio Day02-1
  2. StringUtil中常用的方法
  3. Linux 查看内存插槽数、最大容量和频率
  4. 使用Nsight查找CE3的渲染bug
  5. XMLHttpRequest.overrideMimeType()
  6. Python的__init__和self是做什么的?
  7. HDU 4389——X mod f(x)(数位DP)
  8. matlab双目标定
  9. 360和腾讯QQ的那场战争!
  10. mysqldump 快还是navicat快_剪辑软件评测:选喵影工厂、爱剪辑还是快剪辑?
  11. 支付宝小程序自定义键盘-车牌号键盘
  12. linux leach仿真数据传输图性能,基于OMNeT-+-+的Leach协议的仿真研究.pdf
  13. tesseract_OCR识别英文
  14. 基于QT+ffmpeg+SDL2的流媒体播放器
  15. ajax hapi上传文件,在hapi框架里使用ajax提交表单数据,但是服务端接收到的数据是空对象。怎么办啊?...
  16. python 字符串与ASCII码转换的脚本
  17. HTTP请求和请求头的详解
  18. POI批量导出Excel ZIP打包下载
  19. 联想拯救者Y9000P和华硕ROG幻16哪个好
  20. ajax、php、json异步数据处理

热门文章

  1. 基于小波精英解学习和多角度搜索的新型阴阳平衡优化算法
  2. Mac OS制作Windows10启动盘
  3. 赠书 | 四大通证类型:价值创新的源头
  4. 第十八届中国音视频产业大会(AVF)暨“科技创新奖”颁奖礼在京召开
  5. ios 凭据验证_iOS应用SSL .p12身份验证 – 证书错误(-9825)
  6. pysptk, 语音信号处理工具包( SPTK )的python 封装器
  7. python SQL语句 占位符
  8. wux tab 颜色扩展
  9. 用批处理删除N天前或指定日期时间(前后)创建(或修改)的文件
  10. 关于三角形的心及费马点