前言

最近遇到苹果手机自带的emoji表情的处理问题,由于我们的数据库编码是GBK编码,而苹果的键盘自带的emoji表情,苹果系统的编码格式是UTF8编码,所以在把emoji表情存到GBK编码的数据库的就会出现乱码的现象,这事非常坑爹的事情。但是还有更坑的,由于我们的emoji表情不是有我们客户端来处理的,其实要是我们客户端处理的话很简单,就是把emoji表情处理成相应的唯一字符串,然后存进数据库,字符串GBK编码的数据库肯定可以存。然后我们展示的再处理回来就好,完全我们客户端就可以操作。坑爹的就是,我们传的emoji表情是要给html5去展示,这就存在问题了。


1.如何从一段文字提取emoji表情

下面我给出一个方案,我们知道emoji表情本质就是字符串,是字符串就会有长度,而emoji表情的字符串的长度有2,4,7,3等等,未来随着emoji表情的扩充可能说不定一个emoji表情的长度大于10都有可能,所以我们来遍历一段含有emoji表情的字符串的问题,来检查出有没有emoji表情是很不理想的选择,虽然可能for循环遍历也可能弄出来,但这可能需要花费大量的时间和精力去完成,不过所幸的是,苹果给我们用了一个好的遍历的方法


检测表情的输入
- (NSString *)stringContainsEmoji:(NSString *)string
{__block BOOL returnValue = NO;__block NSString *tempStr = @"";[string enumerateSubstringsInRange:NSMakeRange(0, [string length])options:NSStringEnumerationByComposedCharacterSequencesusingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop) {NSString *tempEmoji = @"";const unichar high = [substring characterAtIndex: 0];*** Surrogate pair (U+1D000-1F9FF)***if (0xD800 <= high && high <= 0xDBFF) {const unichar low = [substring characterAtIndex: 1];const int codepoint = ((high - 0xD800) * 0x400) + (low - 0xDC00) + 0x10000;if (0x1D000 <= codepoint && codepoint <= 0x1F9FF){returnValue = YES;tempEmoji = [self getEmojiToShijinZhi:substring];}***Not surrogate pair (U+2100-27BF)***} else {if (0x2100 <= high && high <= 0x27BF){returnValue = YES;tempEmoji = [self getEmojiToShijinZhi:substring];}}if (returnValue == YES) {tempStr = [tempStr stringByAppendingString:tempEmoji];}else{tempStr = [tempStr stringByAppendingString:substring];}returnValue = NO;}];return tempStr;}

上面的* Surrogate pair (U+1D000-1F9FF)*Not surrogate pair (U+2100-27BF)应该是说明emoji表情的uinicode编码范围。

我是参考这个简书作者: [iOS]检测字符串中是否包含emoji表情


2.emoji表情转化成实体字符

实体字符就是emoji表情可以不用做任何处理就可以显示出来是不是很方便,但是它有个很大毛病,不是所有的表情都支持的,因为的苹果自带的emoji表情一直在扩充,但是对应的实体字符不一定跟上脚步,所以emoji表情也是转化成实体字符也是支持部分。

我也是参考一位楼主的文章: 移动前端手机输入法自带emoji表情字符处理

上面的链接说明的很清楚,但是没有说明怎么把emoji表情转化成uinicode编码格式的字符串,uinicode字符串编码再去取十进制的字符,再然后前面加 &# 就可以了,但是我要说是转化成uinicode编码,我在网上查看到这个

- (NSString *)getEmojiToShijinZhi:(NSString *)text{NSString *hexstr = @"";for (int i = 0; i < [text length] / 2 && ([text length] % 2 == 0) ; i++){// three bytesif (([text characterAtIndex:i*2] & 0xFF00) == 0 ) {hexstr = [hexstr stringByAppendingFormat:@"%1X%1X",[text characterAtIndex:i*2],[text characterAtIndex:i*2+1]];}else{// four byteshexstr = [hexstr stringByAppendingFormat:@"%1X",MULITTHREEBYTEUTF16TOUNICODE([text characterAtIndex:i*2],[text characterAtIndex:i*2+1])];}}LYNSLog(@"(unicode) [%@]",hexstr);if (![hexstr isEqualToString:@""]) {NSString * temp10 = [NSString stringWithFormat:@"%lu",strtoul([hexstr UTF8String],0,16)];LYNSLog(@"心跳数字 10进制 %@",temp10);//转成数字int cycleNumber = [temp10 intValue];LYNSLog(@"心跳数字 :%d",cycleNumber);return [NSString stringWithFormat:@"&#%d",cycleNumber];}return hexstr;
}

但是这个有个很大的问题是emoji表情的字符串长度是奇数的话就没法转码,我也不知道是那个楼主的特意写的呢,还是其他的原因,
其实最主要就是

hexstr = [hexstr stringByAppendingFormat:@”%1X%1X”,[text characterAtIndex:i*2],[text characterAtIndex:i*2+1]];

这个%1X就是打印十六进制的,而uinicode就是十六进制的,所以老铁没毛病呀,哈哈,Unicode百度百科 这里就是原因。
所以打印十六进制前面加个U+就是uinicode的表示方法


3.总结

其实他的这个方案也不是解决所有的emoji表情转成实体字符都能显示,只有最基本常用的几个表情才能利用实体字符显示出来,如果谁有更好的方法请告之一下,毕竟分享是一个很有趣的事情,大家共同进步,探讨,才能接触更多的东西,学习了解更多的东西呀

iOS的emoji表情在数据库不支持UTF-8格式的处理相关推荐

  1. Java | MySQL Emoji表情写入数据库时报错问题解决,Incorrect string value: ‘\xF0\x9F\x98\x84\xF0\x9F...‘ for column

    现象: 将Emoji表情存入数据库时,报如下错误: Cause: java.sql.SQLException: Incorrect string value: '\xF0\x9F\x99\x83\xF ...

  2. php mysql emoji表情_php 让MySQL支持Emoji表情 mysql 5.5.3+

    让MySQL支持Emoji表情 mysql 5.5.3+ 让mysql支持Emoji表情,涉及无线相关的 MySQL 数据库建议都提前采用 utf8mb4 字符集. mysql 版本 5.6 1 解决 ...

  3. iOS禁止输入emoji表情

    因为emoji编码在android或者pc设备没有很好的支持,所以有时候为了禁止emoji表情的输入,因为关闭不了系统emoji的键盘,那只能根据编码把emoji表情过滤掉,写了一个NSString的 ...

  4. Java Base64 加密解密 (数据加密或解决手机Emoji表情被数据库过滤掉的问题)

    2017年06月08日 10:15:19 glimmer_it 阅读数:359更多 个人分类: 安全加密 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.ne ...

  5. iOS中Emoji表情的判断

    问题 服务器端不支持Emoji表情,因此客户端在上传用户输入时,不能包含Emoji表情. 解决方案 在客户端发送请求前,判断用户输入中是否含有表情,如果含有表情,则提示用户重新输入.这个过程关键是如何 ...

  6. Android IOS风格Emoji表情,简单实用

    相信大家做项目的时候,特别是聊天相关的,一般都需要用到Emoji. 但是Emoji表情在安卓和IOS两个平台上,显示效果是不一样的,如下图: 言归正传,大家都知道,Emoji就是一组Unicode编码 ...

  7. 让mysql支持emoji表情_让MySQL支持Emoji表情 mysql 5.6

    让MySQL支持Emoji表情,涉及无线相关的 MySQL数据库建议都提前采用 utf8mb4 字符集. mysql 版本 5.6 1 解决方案:将Mysql的编码从utf8转换成utf8mb4. 需 ...

  8. android显示ios emoji表情符号,教程:在 Android 上也能用 iOS 新 Emoji 表情

    那是一个阳光明媚的周末,我惬意的躺在床上用着我的 Android 机刷微博,看着网上那些段子手,心情无比的舒畅.直到我看见这么一条: 瞬间百万头羊驼从我心头奔过,他到底发了些什么!?为什么我看不见!! ...

  9. 关于微信一系列开发,emoji表情导致数据库报错个人解决办法

    用微信公众号开发举例,我们获取用户信息并且储存进数据库的时候,微信昵称由于可以使用emoji表情,utf-8编码可能2个字节.3个字节.4个字节的字符,但是MySQL的utf8编码只支持3字节的数据, ...

最新文章

  1. 收藏 | 15个CNN关键回答集锦,2019校招面试必备!
  2. java 上传 进度条_Ajax上传文件并显示进度条
  3. 云重磅|中西合璧 联想凌拓瓜熟蒂落;5G实锤 华为推出首部5G折叠手机;​IBM打造Kubernetes无处不在”的模式...
  4. 玩转容器,首先你得登上青云梯
  5. Java JDBC连接数据库 UPDATE更新
  6. 简单的三种实现鼠标经过切换图片的方法
  7. Android打开日历账号管理,Android 日历CalendarProvider
  8. 将分子SMILES生成DGLGraph
  9. 我是住在山里的小和尚,我把我的寺庙生活告诉大家[转载之2]
  10. 如何将视频的每一帧提取成图片
  11. WiFi认证过程需要的协议和服务
  12. 【Python入门教程】第69篇 写入文本文件
  13. 乐讯机器人精简版2016迎春版【隆重发布】
  14. 一碗阳春面(一碗清汤荞麦面)
  15. 【斜率优化】【决策单调】xjb讲课
  16. 魔戒:咕噜发售日确定 将于9月1日发布
  17. GUC-3 模拟CAS算法
  18. apple售后服务官网_Apple准备好订阅捆绑以促进数字服务
  19. 送给大家一个把阿拉伯数字与罗马数字互换的代码 -.- 仅支持4000以下的转化
  20. 微信小程序集成WeUI组件库

热门文章

  1. 做软件测试你选择国企还是互联网大厂,哪个更香?
  2. i9 12900k和r9 5900x哪个好
  3. 6月3号绝地求生服务器维护,绝地求生6月3日今天维护时间 绝地求生6.3更新维护公告...
  4. Android之MediaPlayer加载视频慢
  5. win10模拟android,WIN10开安卓模拟器就蓝屏
  6. python函数求绝对值abs_Python函数篇
  7. 页面中元素居中定位的几种方法
  8. html中图片鼠标滑过偏移,jQuery和css3鼠标滑过网格相邻图片浮动效果
  9. PostgreSQL查询用户密码密码解密修改密码
  10. CISAW信息安全保障人员认证考试难吗?