解决方案有两种:

一:禁用表情,即限制用户不能输入表情。一般情况应该由服务器在数据库中添加emoji对应的转码表以支持客户端发送emoji表情。

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

1、利用下面这个方法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;
}

2、利用下面这个方法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;
}作者:奋斗的七月
链接:https://www.jianshu.com/p/d0f6c62b57e1
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

3、利用下面这个方法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{}

二:可以输入并正常显示表情:

1、含有表情的字符串进行编码后再发送给服务端:

NSString *encodedString = (NSString *)CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (CFStringRef)urlString, (CFStringRef)@"!$&'()*+,-./:;=?@_~%#[]", NULL, kCFStringEncodingUTF8);

2、对从服务器获取回来含有表情的字符串进行反转后显示在页面上:

NSString *showText = [serverString stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

需要注意的是:

这里在你把转码后的操作发给服务器后, 需要做的一个额外操作就是, 你再从服务器去回来显示时, 需要反转一下之前的编码才能正常显示出表情符号, 否则就是一堆乱码

iOS输入表情后系统异常相关推荐

  1. 房产科把用户申请表输入计算机后,系统首先检查申请表的合法性,房产管理系统.doc...

    文档介绍: 软件学院课程设计报告书课程名称数据库原理及应用课程设计设计题目房产管理系统专业班级软件09-6学号092001014姓名吕明远指导教师孙宁2011年6月目录1设计时间 22设计目的 23设 ...

  2. iOS限制输入表情(emoji)

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

  3. 解决使用360卫士清理后出来的系统异常故障

    解决使用360卫士清理后出来的系统异常故障 一朋友使用360卫士清理系统,重启电脑后在Windows登录时出错,桌面好多图标都不见了.请我帮忙检修. 打开电脑到,在Windows登录时弹出一个标题栏为 ...

  4. ios键盘done中文_IOS_IOS关闭键盘的方法,首先输入完成后按键盘上的done - phpStudy...

    IOS关闭键盘的方法 首先输入完成后按键盘上的done关闭键盘 首先在Interface Builder中选择TextFields,然后在Text Field Attributes中找到Text In ...

  5. w7系统计算机搜索无法搜索了,win7系统在搜索框中输入文字后无法搜索的详细教程...

    win7系统使用久了,好多网友反馈说win7系统在搜索框中输入文字后无法搜索的问题,非常不方便.有什么办法可以永久解决win7系统在搜索框中输入文字后无法搜索的问题,面对win7系统在搜索框中输入文字 ...

  6. android app被系统回收后重启异常的解决方法

    APP在后台运行的时候时常会发生被系统回收的事情,可能是内存不足的多种原因造成.被系统回收后系统任然会保留APP的activity栈,用以恢复,但是这样就存在很多的问题需要解决,如果activity没 ...

  7. iOS 14.5.1 系统后出现了发烫、运行卡顿、跑分降低的解决方法

    不少 iPhone 11 和 iPhone 12 系列的用户反映,更新到苹果最新的 iOS 14.5.1 系统后出现了发烫.运行卡顿.跑分降低的问题. 我们可以通过以下方法来解决 打开设置 - App ...

  8. XP系统电脑因“未激活”无法登录进入桌面,而输入序列号后提示“已激活”,以此死循环

    问题1  xp到登入界面,提示你激活点击是否激活,点击是又开始注销一直循环 问题2    电脑因"未激活"无法登录进入桌面,而输入序列号后提示"已激活",以此死 ...

  9. 毕业设计-人脸表情识别系统、人工智能

    人脸表情识别系统 1. 前言 在这个人工智能成为超级大热门的时代,人脸表情识别已成为其中的一项研究热点,而卷积神经网络.深度信念网络和多层感知器等相关算法在人脸面部表情识别领域的运用最为广泛.面部的表 ...

最新文章

  1. 2020ICPC·小米 网络选拔赛第一场(D. Router Mesh)
  2. Android ViewGroup等容器控件的使用
  3. 高中上不上分数低学计算机,中考分数低该怎么办 上不了高中有什么出路
  4. 横竖屏切换时候Activity的生命周期
  5. java 域的隐藏_Windows Server 2008R2\2012\2016使用域策略自定义隐藏指定驱动器
  6. 新版:全世界最前沿的125科学问题
  7. 亚马逊服务器维护,Amazon EC2 维护帮助页面
  8. Oracle书籍资料链接——更新ing
  9. Setup Factory 打包工具部分功能代码解
  10. STC 51单片机仿真总结
  11. 【无标题】setting.json 配置
  12. hdu5773 2016年多校4 nlogn求LIS
  13. 把内存中的数据传送到计算机硬盘称为,将内存中的数据传送到计算机硬盘的过程称为什么...
  14. 7-5 字符串对称 (10 分)
  15. Matlab R2017b 自动驾驶工具箱学习笔记(2)_Tutorials_Visual Perception Using Monocular Camera
  16. ICML 2022|达摩院多模态模型OFA,实现模态、任务和架构三个统一
  17. 肝了1个月!2022 顶会论文代码大合集!
  18. nextdate函数白盒测试问题 软件测试_NextDate函数测试用例 -
  19. shell判断命令是否执行成功
  20. jsp042ssm宠物狗猫咪交流网站

热门文章

  1. 德玛西亚、vscode开发必备插件
  2. Linux操作系统中的7件武器
  3. 直播造星3年:除了冯提莫 你还记得几个出圈的网红?
  4. [CareerCup] 6.5 Drop Eggs 扔鸡蛋问题
  5. 服务器 关闭系统默认共享,新手们请别随意关闭默认共享
  6. python游戏引擎开发二_python制作galgame引擎(二)
  7. Linux配置网络详细笔记
  8. (二十二)波、波、波
  9. Java+Swing实现五子棋游戏
  10. 【概率论】条件概率与独立性题目