前言

最近遇到苹果手机自带的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. Linux下通过gettimeofday函数获取程序段执行时间
  2. 人为何会发烧,超过42°C会怎样?
  3. Gartner预测2019年十大「数据和分析技术」趋势:增强型分析成为重要卖点
  4. 【转载】C#编码标准━━项目设置和项目结构
  5. 把文档放到PNG图片中
  6. java文本框背景_background 设置文本框背景图
  7. 【2021年】通过vue-cli创建electron项目
  8. boost::regex模块部分正则表达式相关的测试程序
  9. 基于java springboot+mybatis OA办公自动化系统设计和实现
  10. webStorm关闭自动保存
  11. 关于app.config不能即时保存读取的解决方案
  12. 【最短路径问题笔记】SPFA算法及负环的判断
  13. Gradle体验/第一篇:下装、安装、配置、体验
  14. 【工具】VirtualBox装VBoxGuestAdditions增强工具失败解决方法和共享文件夹设置
  15. 江西交通职业技术学院计算机网课,第16章-桥墩计算_江西交通职业技术学院:桥涵工程(高职、精品课程)_ppt_大学课件预览_高等教育资讯网...
  16. FlashFXP导出导入站点
  17. oracle证件号脱敏,oracle 数据脱敏
  18. winxp连接不到HP LaserJet Pro M128fp MFP解决方法
  19. plotjuggler⬅ROS1/ROS2画轨迹神器➡rqt_plot+rqt_multiplot之超级加强版
  20. 转载:机器学习算法工程师秋招总结

热门文章

  1. 【Proteus仿真】【STM32单片机】温度报警控制系统设计
  2. 主题:分支操作(Eclipse)
  3. .net/C# 微信小程序如何生成二维码图片
  4. 开源后台管理系统地址
  5. android 广播的使用
  6. 项目管理英语词汇总结·二十一
  7. 小学信息技术 用计算机画画 教学目标,小学信息技术三年级上册用计算机画画教学设计.doc...
  8. 《PBI系列 类目大词 群店 竞争透视 07》花随花心著
  9. 【直播数据分析报告】2020年Q4淘宝直播服装行业研究报告-知瓜数据
  10. Java中令人眼花撩乱的数字魔法!