有时候在开发时会遇到不希望字符串中包含emoji表情的情况,Google之后发现了方法,但是似乎iOS9之后的emoji无法过滤,继续寻找方法,在一个NSString的扩展中发现了办法

#import <Foundation/Foundation.h>/**Category to search emojis on an NSString.The category allows to check if has emojis, the number of emojis and the range of the emojis.*/
@interface NSString (EMOEmoji)/**Calculate the NSRange for every emoji on the string.@return array with the range for every emoji.*/
- (NSArray *)emo_emojiRanges;/**Calculate if the string has any emoji.@return YES if the string has emojis, No otherwise.*/
- (BOOL)emo_containsEmoji;/**Calculate if the string consists entirely of emoji.@return YES if the string consists entirely of emoji, No otherwise.*/
- (BOOL)emo_isPureEmojiString;/**Calculate number of emojis on the string.@return the total number of emojis.*/
- (NSInteger)emo_emojiCount;@end
<pre name="code" class="objc">#import "NSString+EMOEmoji.h"@implementation NSString (EMOEmoji)#pragma mark - EmojiRanges- (NSArray *)emo_emojiRanges
{__block NSMutableArray *emojiRangesArray = [NSMutableArray new];[self enumerateSubstringsInRange:NSMakeRange(0,[self length])options:NSStringEnumerationByComposedCharacterSequencesusingBlock:^(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 <= 0x1f9c0){[emojiRangesArray addObject:[NSValue valueWithRange:substringRange]];}}}else if (substring.length > 1){const unichar ls = [substring characterAtIndex:1];if (ls == 0x20e3 ||ls == 0xfe0f ||ls == 0xd83c){[emojiRangesArray addObject:[NSValue valueWithRange:substringRange]];}}else{// non surrogateif (0x2100 <= hs &&hs <= 0x27ff){[emojiRangesArray addObject:[NSValue valueWithRange:substringRange]];}else if (0x2B05 <= hs &&hs <= 0x2b07){[emojiRangesArray addObject:[NSValue valueWithRange:substringRange]];}else if (0x2934 <= hs &&hs <= 0x2935){[emojiRangesArray addObject:[NSValue valueWithRange:substringRange]];}else if (0x3297 <= hs &&hs <= 0x3299){[emojiRangesArray addObject:[NSValue valueWithRange:substringRange]];}else if (hs == 0xa9 ||hs == 0xae ||hs == 0x303d ||hs == 0x3030 ||hs == 0x2b55 ||hs == 0x2b1c ||hs == 0x2b1b ||hs == 0x2b50){[emojiRangesArray addObject:[NSValue valueWithRange:substringRange]];}}}];return emojiRangesArray;
}#pragma mark - ContainsEmoji- (BOOL)emo_containsEmoji
{__block BOOL containsEmoji = NO;[self enumerateSubstringsInRange:NSMakeRange(0,[self length])options:NSStringEnumerationByComposedCharacterSequencesusingBlock:^(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 <= 0x1f9c0){containsEmoji = YES;}}}else if (substring.length > 1){const unichar ls = [substring characterAtIndex:1];if (ls == 0x20e3 ||ls == 0xfe0f ||ls == 0xd83c){containsEmoji = YES;}}else{// non surrogateif (0x2100 <= hs &&hs <= 0x27ff){containsEmoji = YES;}else if (0x2B05 <= hs &&hs <= 0x2b07){containsEmoji = YES;}else if (0x2934 <= hs &&hs <= 0x2935){containsEmoji = YES;}else if (0x3297 <= hs &&hs <= 0x3299){containsEmoji = YES;}else if (hs == 0xa9 ||hs == 0xae ||hs == 0x303d ||hs == 0x3030 ||hs == 0x2b55 ||hs == 0x2b1c ||hs == 0x2b1b ||hs == 0x2b50){containsEmoji = YES;}}if (containsEmoji){*stop = YES;}}];return containsEmoji;
}#pragma mark - PureEmojiString- (BOOL)emo_isPureEmojiString
{if (self.length == 0) {return NO;}__block BOOL isPureEmojiString = YES;[self enumerateSubstringsInRange:NSMakeRange(0,[self length])options:NSStringEnumerationByComposedCharacterSequencesusingBlock:^(NSString *substring,NSRange substringRange,NSRange enclosingRange,BOOL *stop){BOOL containsEmoji = NO;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 <= 0x1f9c0){containsEmoji = YES;}}}else if (substring.length > 1){const unichar ls = [substring characterAtIndex:1];if (ls == 0x20e3 ||ls == 0xfe0f ||ls == 0xd83c){containsEmoji = YES;}}else{// non surrogateif (0x2100 <= hs &&hs <= 0x27ff){containsEmoji = YES;}else if (0x2B05 <= hs &&hs <= 0x2b07){containsEmoji = YES;}else if (0x2934 <= hs &&hs <= 0x2935){containsEmoji = YES;}else if (0x3297 <= hs &&hs <= 0x3299){containsEmoji = YES;}else if (hs == 0xa9 ||hs == 0xae ||hs == 0x303d ||hs == 0x3030 ||hs == 0x2b55 ||hs == 0x2b1c ||hs == 0x2b1b ||hs == 0x2b50){containsEmoji = YES;}}if (!containsEmoji){isPureEmojiString = NO;*stop = YES;}}];return isPureEmojiString;
}#pragma mark - EmojiCount- (NSInteger)emo_emojiCount
{__block NSInteger emojiCount = 0;[self enumerateSubstringsInRange:NSMakeRange(0,[self length])options:NSStringEnumerationByComposedCharacterSequencesusingBlock:^(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 <= 0x1f9c0){emojiCount = emojiCount + 1;}}}else if (substring.length > 1){const unichar ls = [substring characterAtIndex:1];if (ls == 0x20e3 ||ls == 0xfe0f ||ls == 0xd83c){emojiCount = emojiCount + 1;}}else{// non surrogateif (0x2100 <= hs &&hs <= 0x27ff){emojiCount = emojiCount + 1;}else if (0x2B05 <= hs &&hs <= 0x2b07){emojiCount = emojiCount + 1;}else if (0x2934 <= hs &&hs <= 0x2935){emojiCount = emojiCount + 1;}else if (0x3297 <= hs &&hs <= 0x3299){emojiCount = emojiCount + 1;}else if (hs == 0xa9 ||hs == 0xae ||hs == 0x303d ||hs == 0x3030 ||hs == 0x2b55 ||hs == 0x2b1c ||hs == 0x2b1b ||hs == 0x2b50){emojiCount = emojiCount + 1;}}}];return emojiCount;
}@end

ps:扩展的链接是https://github.com/woxtu/NSString-RemoveEmoji 感谢作者

检测字符串包含emoji表情相关推荐

  1. 判断字符串中是否包含Emoji表情代码

    判断字符串中是否包含Emoji表情代码: + (BOOL)stringContainsEmoji:(NSString *)string { __block BOOL returnValue = NO; ...

  2. MySQL 字符串删除表情符_字符串中Emoji表情处理

    吃了经验的亏,因为Emoji表情引起的项目bug被撸主遇到两次了,总有一些调皮的小朋友爱用表情来搞点事.第一次把当时那个表改为utf8mb4解决了,第二次说啥都不好使.网上找了半天,发现好多人不去实验 ...

  3. 微信昵称乱码 mysql_微信网页开发获取用户昵称乱码 微信昵称包含emoji表情乱码的解决方案...

    微信网页开发获取用户昵称乱码 微信昵称包含emoji表情乱码的解决方案如下: 问题产生原因:由于数据库及属性一致设为utf8,而utf8只支持1-3个字节.当用户昵称为emoji表情时,获取用户基本信 ...

  4. 微信小程序web-view嵌入h5———微信名包含emoji表情,导致数据无法存入数据库

    由于部分用户微信名包含emoji表情导致无法存入数据库. 报错为:[2019-08-27 16:21:12] [ERROR] [org.hibernate.engine.jdbc.spi.SqlExc ...

  5. 【Java】如何检测、替换4个字节的utf-8编码(此范围编码包含emoji表情)

    1. > 参考的优秀文章 1.十分钟搞清字符集和字符编码 2.Java中byte与16进制字符串的互相转换 3.[异常处理]Incorrect string value: '\xF0\x90\x ...

  6. Emoji-java:判断字符串是否包含Emoji表情符

    Emoji-java Emoji-java 具体代码实现 Emoji-java github地址: https://github.com/vdurmont/emoji-java 具体代码实现 引入依赖 ...

  7. 微信昵称包含emoji表情,保存异常

    MySQL要存储emoji表情,由于emoji表情的unicode编码占用4个字节,而Mysql的utf8编码最多只能存储3个字节, 所以保存到数据库时会产生异常,一般两种解决方法, 方法一 修改数据 ...

  8. 字符串中Emoji表情处理

    吃了经验的亏,因为Emoji表情引起的项目bug被撸主遇到两次了,总有一些调皮的小朋友爱用表情来搞点事.第一次把当时那个表改为utf8mb4解决了,第二次说啥都不好使.网上找了半天,发现好多人不去实验 ...

  9. java字符串中Emoji表情处理

    在爬虫获取字符串内容时,遇到内容中有手机表情,存入数据库是报错!网上找了半天,发现好多人不去实验一下就复制别人的代码网上发,然后导致我拿来用直接不行.最终找到一个可以行办法,在此总结一下: 方法主要有 ...

最新文章

  1. flask https启动
  2. 此上下文中不允许函数定义。_深度好文 | 你知道Go中的 context 是怎么实现的吗?...
  3. windows7环境下的http-server的问题 排查
  4. 按键驱动的思路分析和代码实现
  5. Zedboard学习(三):PL下流水灯实验
  6. delphi7存储过程传入数组_数据结构线性表之顺序存储 类的封装
  7. Linux网络编程服务器模型选择之并发服务器(上)
  8. Linux内核中makefile有什么作用?深入解析makefile工作过程和原理
  9. 单片机STM32开发环境的安装
  10. 基于和风天气API开发的天气查询小工具(含源码)
  11. Foxdisk11-小字库显示汉字2
  12. 详述IT项目文档类别
  13. 影响人生的一百条格言
  14. 四川大学计算机专业调剂,2020年四川大学计算机学院(软件学院)考研调剂信息...
  15. 工业物联网案例:城市供水管网渗漏监测预警系统
  16. c语言程序设计刘会超答案,C语言程序设计案例教程
  17. [洛谷P1856] [USACO5.5]矩形周长Picture
  18. linux的debin版本,8个最佳的基于Debian的Linux发行版
  19. Random Walk(随机游走)
  20. COINDAO将迎来首次回购分红,COINDAO白名单和团队长参与方式。

热门文章

  1. 对称密码的编程使用(DES、3DES、AES)
  2. [机器学习]回归--Polinomial Regression 多项式回归
  3. Mac平台上的几款串口工具
  4. 精度,精确率,召回率_了解并记住精度和召回率
  5. Linux进程调度策略分析
  6. 看完这一系列,彻底搞懂 Gradle
  7. 银行利率是5.45%,房贷是4.9%,有钱该提前还房贷还是存款?
  8. 突发!央行确认支付宝3种违法违规行为,处罚18万元!
  9. 甩开镣铐的精神舞蹈:推荐长篇小说《炼狱之花》
  10. 程序员们请别做下一个小贝