iOS 禁用emoji系统中文键盘输入失效

开发中很多是不允许emoji上传的,这时候我们通过编码禁用了emoji,其实暗藏风险。 在开发中我们再代理中禁用emoji。搜狗输入法没有任何问题,但是当你使用系统的中文九宫格键盘时你发现,根本点不了,也就是系统的九宫格被禁用了,这是什么原因呢,我们先输入一个字符看下结果。

输入图片说明

如上图,打印出一个特殊符号,由此我们猜测系统输入中文第一个字符都是特殊字符,因此这些被我们当做emoji禁用了,导致输入不成功。 那么我只需要给这些特殊字符“放行”即可 添加在代理中这样写 // 对系统键盘做判断 - ->不允许输入表情

    if ([@"➋➌➏➎➍➐➑➒" containsString:text]) {//包含系统中文输入法字符
        return YES;
    }
    if ([self stringContainsEmoji:text]) {//包含emoji字符 不允许输入
        return NO;
    }

顺便贴出我的emoji判断,禁用率百分之95吧。剩余的只能自己判断截取了 //是否含有表情 - (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;
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏君赏技术博客

GB代码规范1.0

对于如果导入是UIKit类就使用UIKIT_EXTERN 如果是Founction使用关键词FOUNDATION_EXTERN

14320
来自专栏梧雨北辰的开发录

iOS运行时Runtime应用

18920
来自专栏岑志军的专栏

(3)OC中消息和消息转发-01

13140
来自专栏码生

ios KVO 官方文档学习

When an observer is registered for an attribute of an object the isa pointer of ...

13530
来自专栏SeanCheney的专栏

《利用Python进行数据分析·第2版》第6章 数据加载、存储与文件格式6.1 读写文本格式的数据6.2 二进制数据格式6.3 Web APIs交互6.4 数据库交互6.5 总结

访问数据是使用本书所介绍的这些工具的第一步。我会着重介绍pandas的数据输入与输出,虽然别的库中也有不少以此为目的的工具。 输入输出通常可以划分为几个大类:读...

60860
来自专栏黄Java的地盘

[翻译]WebSocket协议第二章——Conformance Requirements

本文为WebSocket协议的第二章,本文翻译的主要内容为WebSocket协议中相关术语的介绍。

10110
来自专栏一“技”之长

iOS中JSON数据的解析 原

官方为我们提供的解析JSON数据的类是NSJSONSerialization,首先我们先来看下这个类的几个方法:

8750
来自专栏技术总结

iOS进阶之runtime作用

24290
来自专栏冰霜之地

iOS 如何实现Aspect Oriented Programming (上)

在“Runtime病院”住院的后两天,分析了一下AOP的实现原理。“出院”后,发现Aspect库还没有详细分析,于是就有了这篇文章,今天就来说说iOS 是如何实...

17820
来自专栏哈雷彗星撞地球

Runtime系列(二)--Runtime的使用场景

Runtime 理解介绍的文章非常多,我只想讲讲Runtime 可以用在哪里,而我在项目里哪些地方用到了runtime。多以实际使用过程为主,来介绍runtim...

11530

扫码关注云+社区

领取腾讯云代金券