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

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 plaincopy

  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. throw new XmlPullParserException("Illegal XML character: " + Integer.parseInt(codePoint+"", 16));
  13. }

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

解决方法:

[java] view plaincopy

  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. throw new XmlPullParserException("Illegal XML character: " + Integer.parseInt(codePoint+"", 16));
  14. }
时间: 2024-10-10 17:16:40

APP后端处理表情的一些技巧的相关文章

app后端设计--总目录 (转)

特此说明,我转载的!!! app后端设计(1)--api app后端设计(2)--xmpp的使用 app后端设计(3)--短信,邮件,推送服务 app后端设计(4)-- 通讯的安全性 app后端设计(5)-- 表情的处理 app后端设计(6)-- LBS app后端设计(7)-- 项目管理 app后端设计(8)-- 数据库分表 app后端设计(9)-- 动态通知 app后端设计(10)--数据增量更新 app后端设计(11)-- 系统架构 app后端设计(12)--图片的处理 app后端设计(1

app后端设计(0)--总目录(转)

原文:http://blog.csdn.net/newjueqi/article/details/19003775 做了接近两年app相关的系统架构,api设计,先后在两个创业公司中工作,经历过手机网页端,android客户端,iphone客户端,其中的乐与苦,得与失,仰首问天有谁知?我觉得是时候来个总结,把相关的技术和心得记录下来. 注:这系列文章谈到的经验是根据自身在小型创业团队中总结的,大牛们请飘过^-^ app后端设计(1)--api app后端设计(2)--xmpp的使用 app后端设

app后端设计(php)

来源:http://blog.csdn.net/column/details/mobilebackend.html?page=1 做了3年app相关的系统架构,api设计,先后在3个创业公司中工作,经历过手机网页端,android客户端,iphone客户端,现在从事日pv过5千万的云后端开发.其中的乐与苦,得与失,仰首问天有谁知?我觉得是时候来个总结,把相关的技术和心得记录下来. app后端设计(1)--api app后端设计(2)--xmpp的使用 app后端设计(3)--短信,邮件,推送服务

app后端设计(0)--总目录

原文:http://blog.csdn.net/newjueqi/article/details/19003775 做了接近两年app相关的系统架构,api设计,先后在两个创业公司中工作,经历过手机网页端,android客户端,iphone客户端,其中的乐与苦,得与失,仰首问天有谁知?我觉得是时候来个总结,把相关的技术和心得记录下来. 注:这系列文章谈到的经验是根据自身在小型创业团队中总结的,大牛们请飘过^-^ app后端设计(1)--api app后端设计(2)--xmpp的使用 app后端设

1.用互联网的产品思维打造一本app后端的书

刚刚接触app后端,是做完adidas中国的官方商城的时候,那时不清楚app后端应该怎么架构,只能摸着石头过河,网络上只有一些零散的资料,遇到问题,只能不断地搜索,思考,务必找到解决问题的方法. 在从事app后端的3年里,亲手打造了两款社交app,现在也在日pv过亿的云端平台里从事研发工作,慢慢地对app后端的架构有了一些体会. 把自己的工作笔记发表在CSDN博客专栏"app后端技术架构"发表后,收到了很多网友的反馈,后来为了方便交流,就创建了"app后端技术"qq

33.APP后端处理视频的方案

在当前的app应用中,到处都能看到视频的身影,例如,在社交类的app上,用户可以拍摄属于自己的小视频,并发布到相应得栏目,增加和好友们互动的机会. 后台常见的视频处理有以下几种: ·          视频的截图,很多视频列表上显示的一张图片,这张图片就是通过截取视频的某一帧(通常是第一帧)得到的. ·          视频加水印,出于版权保护的目的,需要添加水印. ·          视频转码,允许用户上传手机上的视频,并转换为app后端支持的格式. 视频的处理对于大多数程序员来说是个很陌

18.app后端如何实现LBS

移动互联网,除了一直在线这个特点外,还有一个重要特点,能定位到手机的位置.查找附近的人,附近的餐馆等服务,以及大量的o2o应用, 都需要使用LBS(Location Based Services).那么,如何用户的地理坐标?如何去查找所需的附近的数据呢?在这篇文章中,为你一一道来. 1.如何获取用户的地理坐标 现在,基于手机来获取用户的地理坐标,主要是下面两种方法: (1)使用手机上的GPS模块 (2)使用手机网络所连接的基站定位 一般是使用第一种方法,当手机上没有GPS模块,就用第二种方法来定

APP后端处理视频的方案

在当前的app应用中,到处都能看到视频的身影,例如,在社交类的app上,用户可以拍摄属于自己的小视频,并发布到相应得栏目,增加和好友们互动的机会. 后台常见的视频处理有以下几种: ·          视频的截图,很多视频列表上显示的一张图片,这张图片就是通过截取视频的某一帧(通常是第一帧)得到的. ·          视频加水印,出于版权保护的目的,需要添加水印. ·          视频转码,允许用户上传手机上的视频,并转换为app后端支持的格式. 视频的处理对于大多数程序员来说是个很陌

8.app后端和web后端的区别

很多从web后端转到app后端的小伙伴经常很茫然,不知道这两者之间有啥区别.本文通过例子,分析web后端和app后端的区别,使各位更好地把握app后端的架构. (1) app后端要慎重考虑网络传输的流量,主要是api设计,图片处理上 现阶段,手机上网的资费还是要按照流量算的,一般的3G用户,每个月的流量几百M,4G用户,每个月的流量也就几G. 如果不考虑网络传输的流量,一张图片就占了几百K,流量用得飞快的. 在前面的文章<7.app和app后端的通讯>中提到,api的返回结果一般是json格式