当前位置:首页 > 开发 > 移动开发 > 正文

解决发送push的emoji表情的实用方案

发表于: 2015-04-13   作者:cfyme   来源:转载   浏览次数:
摘要:     push在发送的时候,有些emoji表情添加不进去,原因是:一个普通中文字符存入数据库时占用3个字节,某些特殊表情会自动占用4个字节,mysql的utf8一个字符最多3字节,而如果要修改为支持4个字节的需要修改数据库配置编码为utf8mb4,但是需要停机重启数据库,由于不能影响线上核心业务,停机成本有点大,所以最终放弃了修改编码的方案。   &nb

    push在发送的时候,有些emoji表情添加不进去,原因是:一个普通中文字符存入数据库时占用3个字节,某些特殊表情会自动占用4个字节,mysqlutf8一个字符最多3字节,而如果要修改为支持4个字节的需要修改数据库配置编码为utf8mb4,但是需要停机重启数据库,由于不能影响线上核心业务,停机成本有点大,所以最终放弃了修改编码的方案。


   
但是,为了满足运营人员需要发送带有特殊符号的push表情,晚上睡觉想了想一些方案,都是以失败告终,第二天想到了一个比较挫的方案,但的确是实用的,因为那些特殊表情数量可能不大,难道一定要存储到数据库吗,我可以写死在java代码里面啊,果断实践,第二天将知知需要的特殊表情搜集起来,存储在java的一个map中,后台在录入表情的时候,就不粘贴表情符号了,而是输入该特殊表情的替代key,在发送push的时候,就把key替换为真正的表情的value


   
测试,上线,问题搞定,该方案的缺点是缺乏灵活的配置性,下次增加新的表情的时候,需要我再次手动添加上去,但不管怎样,总比没有表情要好吧。

 

    

     

   1,定义emoji的表情常量类:

   

package com.taofen8.mobile.constant;

import java.util.HashMap;

/**
 * push表情
 * 如果数据库的编码修改为utf8mb4,线上要重启才有效果,不然保存某些表情会报错
 * 但需要重启数据库,所以放弃修改字符集的方案,把运营需要发push的表情定义在这个类中
 * 缺点是:如果运营需要增加表情,需要手动添加到该类中,缺乏灵活的配置性
 * @author caofy
 *
 */
public class PushBiaoQing {

	public static HashMap<String, String> map = new HashMap<String, String>();
	static{
		/**
		 * 主要后面的框框,看上去一样,其实是不同的表情额
		 */
		map.put("#biaoqing_xiangyou#", "拷贝过来的表情"); 
		map.put("#biaoqing_xiangzuo#", "拷贝过来的表情"); 
		map.put("#biaoqing_damuzhi#", "拷贝过来的表情"); 
		map.put("#biaoqing_haode#", "拷贝过来的表情"); 
		map.put("#biaoqing_aixin4#", "拷贝过来的表情"); 
		map.put("#biaoqing_aixin5#", "拷贝过来的表情"); 
		map.put("#biaoqing_free#", "拷贝过来的表情"); 
		map.put("#biaoqing_new#", "拷贝过来的表情"); 
		map.put("#biaoqing_ok#", "拷贝过来的表情"); 		
	}
}

 

   1,发送push的时候,替换为真正的emoji表情的方法:

   

private void replaceBiaoQing(List<MobilePushSpecial> list) {
		if(CollectionUtils.isEmpty(list)){
			return;
		}
		for(MobilePushSpecial obj : list){
			String message = obj.getMessage();
			Iterator<Map.Entry<String, String>> iterator = PushBiaoQing.map.entrySet().iterator();
			while (iterator.hasNext()) {
				Map.Entry<String, String> entry = (Map.Entry<String, String>)iterator.next();
				String key = entry.getKey();
				String value = entry.getValue();
				message = message.replaceAll(key, value);
			}
			obj.setMessage(message);
		}
	}

 

 

    总结:有时候遇到问题的时候,不要放弃,方法总比苦难多,不要在一个树上吊死,不求技术高深,不管黑猫白猫,能解决业务需求的办法就是好办法。

解决发送push的emoji表情的实用方案

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
让mysql支持emoji表情存取的解决方案 APP移动端无需做任何修改,服务端修改即可。 第一步:修改jdbc
1:先弄到图片 上传到服务器上 2.下载 unicode 和 表情 映射关系xml emoji4unicode.xml 在下面的rar
1:先弄到图片 上传到服务器上 2.下载 unicode 和 表情 映射关系xml emoji4unicode.xml 在下面的rar
1:先弄到图片 上传到服务器上 2.下载 unicode 和 表情 映射关系xml emoji4unicode.xml 在下面的rar
1:先弄到图片 上传到服务器上 2.下载 unicode 和 表情 映射关系xml emoji4unicode.xml 在下面的rar
1:先弄到图片 上传到服务器上 2.下载 unicode 和 表情 映射关系xml emoji4unicode.xml 在下面的rar
1:先弄到图片 上传到服务器上 2.下载 unicode 和 表情 映射关系xml emoji4unicode.xml 在下面的rar
这个是我做Android以来碰到的最烦的东西,该死的emoji表情,恨之入骨。。无奈这个问题分配给我了。
解决方案:将Mysql的编码从utf8转换成utf8mb4。 需要 >= MySQL 5.5.3版本、从库也必须是5.5的了
因为IOS系统支持日文中的字块编码,所以在UILable,UITextField,UIAlertView等控件中使用emoji表情
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号