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

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

百度百科中告诉我们“自苹果公司发布的iOS 5输入法中加入了emoji后,这种表情符号开始席卷全球,目前emoji已被大多数现代计算机系统所兼容的Unicode编码采纳,普遍应用于各种手机短信和社交网络中。[1] ”,Emoji表情最终会被编码成Unicode,因此,只要知道Emoji表情的Unicode编码的范围,就可以判断用户是否输入了Emoji表情。

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

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

    1. /*
    2. *第一种方法,简单粗暴
    3. */
    4. - (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
    5. {
    6. // 不让输入表情
    7. if ([textView isFirstResponder]) {
    8. if ([[[textView textInputMode] primaryLanguage] isEqualToString:@"emoji"] || ![[textView textInputMode] primaryLanguage]) {
    9. NSLog(@"输入的是表情,返回NO");
    10. UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"警告!" message:@"不能输入表情" delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"确定",nil];
    11. [alertView show];
    12. return NO;
    13. }
    14. }
    15. return YES;
    16. }
  2. 为避免当用户通过中文键盘输入中文“哈哈”后出现可选文字中选中的Emoji笑脸,最后在- (void)textFieldDidEndEditing:(UITextField *)textField方法中统一通过检查最终字符串textField/textView.text的内容,通过Emoji筛unicode编码来判断是否存在Emoji表情,如果存在则提醒用户做修改。

    1. //在输入完成时,调用下面那个方法来判断输入的字符串是否含有表情
    2. - (void)textFieldDidEndEditing:(UITextField *)textField
    3. {
    4. if ([self stringContainsEmoji:textField.text]) {
    5. NSLog(@"含有表情");
    6. UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"警告!" message:@"输入内容含有表情,请重新输入" delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"确定",nil];
    7. [alertView show];
    8. textField.text = @"";
    9. [textField becomeFirstResponder];
    10. }else {
    11. NSLog(@"不含有表情");
    12. }
    13. }
    14. /*
    15. *第二种方法,利用Emoji表情最终会被编码成Unicode,因此,
    16. *只要知道Emoji表情的Unicode编码的范围,
    17. *就可以判断用户是否输入了Emoji表情。
    18. */
    19. - (BOOL)stringContainsEmoji:(NSString *)string
    20. {
    21. // 过滤所有表情。returnValue为NO表示不含有表情,YES表示含有表情
    22. __block BOOL returnValue = NO;
    23. [string enumerateSubstringsInRange:NSMakeRange(0, [string length]) options:NSStringEnumerationByComposedCharacterSequences usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop) {
    24. const unichar hs = [substring characterAtIndex:0];
    25. // surrogate pair
    26. if (0xd800 <= hs && hs <= 0xdbff) {
    27. if (substring.length > 1) {
    28. const unichar ls = [substring characterAtIndex:1];
    29. const int uc = ((hs - 0xd800) * 0x400) + (ls - 0xdc00) + 0x10000;
    30. if (0x1d000 <= uc && uc <= 0x1f77f) {
    31. returnValue = YES;
    32. }
    33. }
    34. } else if (substring.length > 1) {
    35. const unichar ls = [substring characterAtIndex:1];
    36. if (ls == 0x20e3) {
    37. returnValue = YES;
    38. }
    39. } else {
    40. // non surrogate
    41. if (0x2100 <= hs && hs <= 0x27ff) {
    42. returnValue = YES;
    43. } else if (0x2B05 <= hs && hs <= 0x2b07) {
    44. returnValue = YES;
    45. } else if (0x2934 <= hs && hs <= 0x2935) {
    46. returnValue = YES;
    47. } else if (0x3297 <= hs && hs <= 0x3299) {
    48. returnValue = YES;
    49. } else if (hs == 0xa9 || hs == 0xae || hs == 0x303d || hs == 0x3030 || hs == 0x2b55 || hs == 0x2b1c || hs == 0x2b1b || hs == 0x2b50) {
    50. returnValue = YES;
    51. }
    52. }
    53. }];
    54. return returnValue;
    55. }

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

UITextView/UITextField检测并过滤Emoji表情符号的更多相关文章

  1. js过滤emoji表情符号

    手机端常常会遇到用户输入框,输入emoji,如果是数据库是UTF8,会遇到报错:SQLException: Incorrect string value: '\xF0\x9F\x98\x84' for ...

  2. 用net匹配并替换iOS标准的emoji表情符号

    using System; using System.Collections.Generic; using System.Linq; using System.Text; namespaceCommo ...

  3. java过滤emoji表情

    import java.util.regex.Matcher; import java.util.regex.Pattern; public class test { /** * 表情过滤 * */ ...

  4. JS判断与过滤的表情符号表情的方法

    一.js判断文本中是否有表情符号表情 isEmojiCharacter(substring){ for ( var i = 0; i <substring.length; i ++){ var ...

  5. Emoji表情符号录入MySQL数据库报错的解决方案(MySQL utf8与utf8mb4区别)

    本文转自:http://blog.itpub.net/26230597/viewspace-1243233/前言:手机app应用评论的时候,恢复表情符号,提示失败. 1,查看tomcat后台日志,核心 ...

  6. java代码过滤emoji表情

    可以新建一个过滤器的类,在类中书写如下代码: public static String filterEmoji(String source) {           if(source != null ...

  7. Emoji表情符号录入MySQL数据库报错

    版本一: 1,查看tomcat后台日志,核心报错信息如下:   Caused by: java.sql.SQLException: Incorrect string value: '\xF0\x9F\ ...

  8. 微信公众平台开发(57)Emoji表情符号

    微信公众平台开发 微信公众平台开发模式 企业微信公众平台 Emoji表情符号 作者:方倍工作室 地址:http://www.cnblogs.com/txw1958/p/crack-golden-egg ...

  9. Emoji表情符号兼容方案(适用ios,android,wp等平台)

    http://blog.csdn.net/qdkfriend/article/details/7576524 Emoji表情符号兼容方案 一 什么是Emoji emoji就是表情符号:词义来自日语(え ...

随机推荐

  1. (转载)sinaeditor漏洞

    SinaEditor简介 SinaEditor是基于新浪博客编辑器的开源编辑器.您可以用它来编辑富文本内容. 编辑器的核心是一个执行队列的调度系统,加入插件来实现功能,并通过事件来驱动编辑器的运行.我 ...

  2. Ural 1043 Cover the Arc

    题目链接:http://acm.timus.ru/problem.aspx?space=1&num=1043 题目大意:一个2000*2000方格坐标,x,y范围都是[-1000,1000]. ...

  3. Scrapinghub | Professional Services

    VShell破解版 VShell破解版 Scrapinghub | Professional Services OUR PROFESSIONAL SERVICES INCLUDE

  4. 干货!如何正确使用Git Flow

    我们已经从SVN 切换到Git很多年了,现在几乎所有的项目都在使用Github管理, 本篇文章讲一下为什么使用Git, 以及如何在团队中正确使用. Git的优点 Git的优点很多,但是这里只列出我认为 ...

  5. 355. Design Twitter

    二刷尝试了别的办法,用MAP代表关注列表. 然后不初始化,但是只要有用户被使用,而他又不在MAP里,就把他加进去,然后让他关注自己.. 但是这样做超时了. 问题在于这个题解法太多,有很多不同的情况. ...

  6. 配置java软件

    到官网下载了jdk和jre的安装包 配置时发现javac显示 "javac不是内部或外部命令,等等一些的问题" 上百度搜索后,发现是win10系统配置path的时候需要写绝对路径而 ...

  7. UINavigationBar-使用总结

    多视图应用程序中,我们常常使用到自定义UINavigationBar来完成导航条的设置.   1.获取导航条   UINavigationBar *navBar = self.navigationCo ...

  8. SpringMVC ModelAndView方法与模板传参接收不到问题

    最近在使用Spring MVC做项目时,碰到一个问题,就是通过ModelAndView与前端模板页面通信时,一直无法在模板中显示出来传过去的参数值. 在网上也查了好久,就是不知道是啥问题,很是郁闷. ...

  9. SQLite的 SQL语法总结

    SQLite库可以解析大部分标准SQL语言.但它也省去了一些特性并且加入了一些自己的新特性.这篇文档就是试图描述那些SQLite支持/不支持的SQL语法的.查看关键字列表. 如下语法表格中,纯文本用蓝 ...

  10. 利用Java API通过路径过滤上传多文件至HDFS

    在本地文件上传至HDFS过程中,很多情况下一个目录包含很多个文件,而我们需要对这些文件进行筛选,选出符合我们要求的文件,上传至HDFS.这时就需要我们用到文件模式. 在项目开始前,我们先掌握文件模式 ...