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 条评论
登录 后参与评论

相关文章

来自专栏黄Java的地盘

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

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

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

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

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

1063
来自专栏码生

ios KVO 官方文档学习

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

1073
来自专栏进步博客

使用copy声明NSString属性

声明一个NSString属性使用copy要优于使用strong。这同样适用于遵守NSCoding协议的不可变类(immutable class),如NSNumb...

692
来自专栏冰霜之地

iOS 如何实现Aspect Oriented Programming (上)

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

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

iOS运行时Runtime应用

1312
来自专栏程序员宝库

移除注释的完善思路:真的可以用正则实现?

网上有很多自称能实现移除JS注释的正则表达式,实际上存在种种缺陷。这使人多少有些愕然,也不禁疑惑到:真的可以用正则实现吗?而本篇文章以使用正则移除JS注释为目标...

1223
来自专栏FreeBuf

浅析ReDoS的原理与实践

*本文原创作者:MyKings,本文属FreeBuf原创奖励计划,未经许可禁止转载 ReDoS(Regular expression Denial of Ser...

5095
来自专栏非典型技术宅

Swift实践:使用CoreData存储多种数据类的通讯录1. CoreData支持存储数据类型2. 使用CoreData存储多种数据类的通讯录3. Codable

1673
来自专栏岑志军的专栏

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

1224

扫码关注云+社区