APP后端处理表情的一些技巧

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介: app应用中文字夹带表情是个很常见的现象。甚至一些40多岁的大叔级用户,也喜欢在自己的昵称中夹带表情,在产品运营后发现这个现象,彻底颠覆了我的世界观。   在后台处理表情的时间,我遇到过下面3个问题:   1.表情在mysql的存储            表情的utf8编码,有时是有4个字节的,所以在一般的utf编码是没法存储的。

app应用中文字夹带表情是个很常见的现象。甚至一些40多岁的大叔级用户,也喜欢在自己的昵称中夹带表情,在产品运营后发现这个现象,彻底颠覆了我的世界观。

 

在后台处理表情的时间,我遇到过下面3个问题:

 

1.表情在mysql的存储

 

         表情的utf8编码,有时是有4个字节的,所以在一般的utf编码是没法存储的。

 

在网上看到一个常用的解决方案,是把mysql升级到5.5,然后把字符编码改为utf8mb4_general_ci。

 

但实际情况是,有可能在以前的app版本中不需要支持表情,这时系统已经运营了一段时间了,这时才把mysql升级并迁移数据,需要很高的运维成本,同时具备一定的风险,例如,迁移前的不同mysql版本间需要数据同步,保证数据的一致性;迁移过程中可能出现意想不到的事情,造成服务停止。

 

但在实践中,我发现了还有一个方法,适用于mysql 5.1,就是把含有表情的那个字段的类型变为blob, 没错,就是用二进制存储,这样就能比较少的改动mysql。

 

2.当文字中夹带表情的处理

 

   很多时候,如果文字中夹带表情,那么这些文字的处理就会出现问题,例如,如果一个用户的昵称带有表情,那么我怎么把这个昵称转换为拼音呢?在推送apns过程中,如果推送的文字中夹带表情,推送到app端后也会显示乱码。

        

在app后端,存在着大量要处理文字中夹带表情的需求。我遇到了这个问题,先是找到了 https://github.com/iamcal/php-emoji这个转换表情的类库,但发现这个类库不支持ios6后新增的表情,最后没办法了,我写了个抓取程序,把 http://punchdrunker.github.io/iOSEmoji/table_html/ios6/index.html中ios6后新增的表情抓取出来,并写了个新的类库并开源了 https://github.com/newjueqi/converemojitostr,这个类库的作用就是把文字中夹带的表情替换为一个特殊的字符(默认是"#")。

 

3.openfire中发送表情引起断开连接的问题

 

openfire中,如果发送某些特殊的字符(例如一些表情符合),会断开xmpp的连接,经查,是由以下的代码问题引起的:

 

src\java\org\jivesoftware\openfire\net\MXParser.java

 

 

[java]  view plain copy
 
  1. protected char more() throws IOException, XmlPullParserException {  
  2.         final char codePoint  = super.more(); // note - this does NOT return a codepoint now, but simply a (single byte) character!  
  3.         if ((codePoint == 0x0) ||  // 0x0 is not allowed, but flash clients insist on sending this as the very first character of a stream. We should stop allowing this codepoint after the first byte has been parsed.  
  4.                 (codePoint == 0x9) ||                              
  5.                 (codePoint == 0xA) ||  
  6.                 (codePoint == 0xD) ||  
  7.                 ((codePoint >= 0x20) && (codePoint <= 0xD7FF)) ||  
  8.                 ((codePoint >= 0xE000) && (codePoint <= 0xFFFD)) ||  
  9.                 ((codePoint >= 0x10000) && (codePoint <= 0x10FFFF))) {  
  10.             return codePoint;  
  11.         }  
  12.           
  13.         throw new XmlPullParserException("Illegal XML character: " + Integer.parseInt(codePoint+"", 16));  
  14.     }  



 

        

        

由于在这里把特殊的字符当成了一个异常,所以openfire会断开连接。

 

解决方法:

 

[java]  view plain copy
 
  1. @Override  
  2.    protected char more() throws IOException, XmlPullParserException {  
  3.     final char codePoint  = super.more(); // note - this does NOT return a codepoint now, but simply a (single byte) character!  
  4.     if ((codePoint == 0x0) ||  // 0x0 is not allowed, but flash clients insist on sending this as the very first character of a stream. We should stop allowing this codepoint after the first byte has been parsed.  
  5.             (codePoint == 0x9) ||                              
  6.             (codePoint == 0xA) ||  
  7.             (codePoint == 0xD) ||         
  8.             //fix some emotion  
  9.             ((codePoint >= 0x20) && (codePoint <= 0xFFFD)) ||               
  10.             ((codePoint >= 0x10000) && (codePoint <= 0x10FFFF))) {  
  11.         return codePoint;  
  12.     }  
  13.       
  14.     throw new XmlPullParserException("Illegal XML character: " + Integer.parseInt(codePoint+"", 16));  
  15.    }      

 

如何联系我:【万里虎】www.bravetiger.cn 【QQ】3396726884 (咨询问题100元起,帮助解决问题500元起) 【博客】http://www.cnblogs.com/kenshinobiy/
相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
JavaScript 数据库
uni-app头像上传(完善个人信息功能),后端NodeJs+MySQL
uni-app头像上传(完善个人信息功能),后端采用的是NodeJs(express.js),数据库采用的是MySQL
|
1月前
uni-app 63egg.js后端用户上线和下线深度剖析
uni-app 63egg.js后端用户上线和下线深度剖析
16 1
|
1月前
|
API
uni-app 25后端api开发和前后端交互(51-60)
uni-app 25后端api开发和前后端交互(51-60)
28 2
uni-app 25后端api开发和前后端交互(51-60)
|
1月前
|
中间件 API 数据库
uni-app 25后端api开发和前后端交互(1-50)
uni-app 25后端api开发和前后端交互(1-50)
100 0
uni-app 25后端api开发和前后端交互(1-50)
|
3月前
|
JavaScript Android开发
Cordova APP 无法访问后端接口
Cordova APP 无法访问后端接口
|
JSON 运维 前端开发
追梦App系列博客——后端架构篇
追梦App系列博客——后端架构篇
追梦App系列博客——后端架构篇
|
监控 网络协议 前端开发
语音聊天app开发,后端技术的灵活运用
语音聊天app开发,后端技术的灵活运用
|
前端开发 Java 关系型数据库
一天撸一个财务APP系统【安卓端+前端+后端】
昨天没事,开发了一个APP的财务系统,如果需要学习开发,可以一起啊!
78 0
一天撸一个财务APP系统【安卓端+前端+后端】
|
缓存 前端开发 API
短视频app开发,从后端视角分析完整开发流程
短视频app开发,从后端视角分析完整开发流程
|
关系型数据库 MySQL PHP
Uni-App - 实战《悦读》之创建项目、后端环境介绍
Uni-App - 实战《悦读》之创建项目、后端环境介绍
168 1