Unified Emoji表情for Android
这个是我做Android以来碰到的最烦的东西,该死的emoji表情,恨之入骨。。无奈这个问题分配给我了。我也只能硬着头皮做。
0.吐个槽先
首先,你要明白什么是emoji表情,不知道的google,不需要支持emoji的可以绕道了。
emoji有很多不同的版本,我tm最讨厌的就是不同版本的了。Unified DoCoMo KDDI Softbank Google
因为ios5升级了,emoji编码从softbank变成unified了。所以只能Android这边改了。伤心。
我要做的工作就是把消息中含有的unified的emoji编码过滤出来,然后映射出对应的表情资源显示出来。
1.准备工作。
google下emoji表情的历史,google code上有个源码,不过是java的,那么你要把它改成java的。。(记得当初解析gif表情时也是把java改成android,可怜的我为咩总是干这活。。)
这里有个link,上面有所有的编码对应转换。Emoji for PHP
然后google code里有所有对应的编码转换的xml。叫emoji4unicode.xml. 这里是link: emoji4unicode
如果没兴趣我等下会直接贴代码的,但是最好你先自己弄明白解析的原理是什么,emoji表情一直在增加,以后要兼容你就得自己想办法了。
2.举个例子
black sun with rays unified : U+2600 softbank: U+E04A
如果以前你解析过softbank,应该很熟悉了。好歹它还有个大致得顺序,解析得时候只要判断是否在这个unicode范围内就可以了。so easy
可是unified完全是无顺序得,所以必须得自己建好映射。
因为原始的emoji.xml很大,把所有的描述信息都放里面了,我不需要,所以我写了个java把xml解析了一遍,然后重新生成了一个我需要的xml。贴个图出来大家看下。
you see , 这个原始的xml实在太大了,有162K,而且还是xml解析。。你想想多耗内存和时间。所以必须把它再转换一遍。
so 这个过程做好了,就可以进行下一步真正的解析了。。
3 解析过程。
因为emoji是有表情分组的,所以你要优先考虑解析出来的也是分好组的。
HashMap<String, ArrayList<String>> emoMap = new HashMap<String, ArrayList<String>>();
我是这么来分组的。
解析xml,然后把2600这样的字符串转换成unicode。这个很关键,映射对应不上肯定也解析不出来。要注意的一点是有的emoji是两个unicode组成的 U+1F1F0 U+1F1F7 这样。。所以么。又多了一个环节。
HashMap<List<Integer>, String> convertMap = new HashMap<List<Integer>, String>();
再定义一个map来存unicode和string字符的映射。
if (xmlpull.getName().equals("e")) {fromAttr = xmlpull.nextText();emos.add(fromAttr);List<Integer> fromCodePoints = new ArrayList<Integer>();if (fromAttr.length() > 6) {String[] froms = fromAttr.split("\\_");for (String part : froms) {fromCodePoints.add(Integer.parseInt(part, 16));}} else {fromCodePoints.add(Integer.parseInt(fromAttr, 16)); }convertMap.put(fromCodePoints, fromAttr); }
这样就把整个解析都写到内存里了。这个就做成单例咯,在程序一进来,application里初始化。
4,解析过程
这里我是把emoji表情解析出来,再改成[e]2600[/e]的形式。然后再用正则再解析一遍(为什么这样做。。因为消息里面不可能只有emoji表情的啊亲。。。你还要解析另外的表情。)
下面是过滤emoji表情的方法:
public String parseEmoji(String input) { if (input == null || input.length() <= 0) {return ""; } StringBuilder result = new StringBuilder(); int[] codePoints = toCodePointArray(input); List<Integer> key = null; for (int i = 0; i < codePoints.length; i++) {key = new ArrayList<Integer>()if (i + 1 < codePoints.length) {key.add(codePoints[i]);key.add(codePoints[i + 1]);if (convertMap.containsKey(key)) {String value = convertMap.get(key);if (value != null) {result.append("[e]" + value + "[/e]");}i++;continue;} } key.clear(); key.add(codePoints[i]); if (convertMap.containsKey(key)) {String value = convertMap.get(key); if (value != null) {result.append("[e]" + value + "[/e]"); }continue; }result.append(Character.toChars(codePoints[i])); }return result.toString(); }
好了,成功解析出来了。但是!!你得先把图片弄到手啊,亲。而且还要我这个格式得。
贴个图
额,话说这个我也是写了个java,把之前得softbank得命名转换成unified的命名,当初我还准备一个一个手动改来着,还好我同事一语点醒梦中人额。。不然我估计就吐血身亡了。程序写多了就是这样,思维固定了。。。
5.发emoji消息。
既然能显示了,你还得发啊,亲。
public static String convertToMsg(CharSequence cs, Context mContext) { SpannableStringBuilder ssb = new SpannableStringBuilder(cs); ImageSpan[] spans = ssb.getSpans(0, cs.length(), ImageSpan.class); for (int i = 0; i < spans.length; i++) { ImageSpan span = spans[i]; String c = span.getSource(); int a = ssb.getSpanStart(span); int b = ssb.getSpanEnd(span); if (c.contains("emoji")) { ssb.replace(a, b, convertUnicode(c)); } } ssb.clearSpans(); return ssb.toString(); } private static String convertUnicode(String emo) { emo = emo.substring(emo.indexOf("_") + 1); if (emo.length() < 6) { return new String(Character.toChars(Integer.parseInt(emo, 16))); } String[] emos = emo.split("_"); char[] char0 = Character.toChars(Integer.parseInt(emos[0], 16)); char[] char1 = Character.toChars(Integer.parseInt(emos[1], 16)); char[] emoji = new char[char0.length + char1.length]; for (int i = 0; i < char0.length; i++) { emoji[i] = char0[i]; } for (int i = char0.length; i < emoji.length; i++) { emoji[i] = char1[i - char0.length]; } return new String(emoji); }
由于时间跨度比较长了。年初得时候写得,基本都记不清了。所以尽量不要来问我额,亲们,我只提供解决方案。
代码我也会上传一份,有需要得可以拿去耍。
源代码:http://stay4it.com/course/20
直接贴代码把,一个还原过程
转载于:https://www.cnblogs.com/zhujiabin/p/5913401.html
Unified Emoji表情for Android相关推荐
- 在Android系统中使用系统自带的emoji表情
一,对emoji表情的理解 emoji表情是一种表情符号,在代码中它现在其实是一组遵循Unicode的编码,即每一个表情符号都对应了一个Unicode编码.更进一步说,emoji表情实际上是一组Uni ...
- android 自带的表情,在Android系统中使用系统自带的emoji表情
一,对emoji表情的理解 emoji表情是一种表情符号,在代码中它现在其实是一组遵循Unicode的编码,即每一个表情符号都对应了一个Unicode编码.更进一步说,emoji表情实际上是一组Uni ...
- Emoji表情图标在iOS与PHP之间通信及MySQL存储
在某个 iOS 项目中,需要一个服务器来保存一些用户数据,例如用户信息.评论等,我们的服务器端使用了 PHP+MySQL 的搭配.在测试过程中我们发现,用户在 iOS 端里输入了 Emoji 表情提交 ...
- mysql 过滤emoji表情_用JS过滤Emoji表情的输入
本文为原创,转载请注明出处: cnzt 文章:cnzt-p 在前端页面开发过程中,总会碰到不允许输入框输入emoji表情的需求,我的思路是通过编码用正则匹配表情,然后将其替换为空字符创.但 ...
- android 兼容ios emoji,Emoji表情符號兼容方案(適用ios,android,wp等平台)
emoji就是表情符號:詞義來自日語(えもじ,e-moji,moji在日語中的含義是字符) 表情符號現已普遍應用於手機短信和網絡聊天軟件. emoji表情符號,在外國的手機短信里面已經是很流行使用的一 ...
- 【Android】显示Emoji表情字符
一.下载AndroidEmoji.ttf字体 地址1:Github Android Platform 地址2:AndroidEmoji.ttf.zip 二.使用 2.1 将字体拷贝到assets/fo ...
- Android自带的emoji表情的使用
原文链接:http://www.itwendao.com/article/detail/53941.html 什么是emoji表情 emoji表情是一种表情符号,在代码中它现在其实是一组遵循Unico ...
- android 调出键盘表情_Android 软键盘和emoji表情切换方案,和微信几乎一样的体验...
注意:本项目还有一个小坑.第一次进去的时候有时候输入框没有得到焦点,没有弹出软键盘,所以不能更好的量取软键盘高度,给了一个默认值787 软键盘默认高度.所以可以忽略不计,一旦弹出了软键盘,这个高度就被 ...
- android 过滤emoji表情符号,android怎样过滤字符串中的emoji表情
满意答案 jdubysct 2016.03.15 采纳率:43% 等级:8 已帮助:863人 解决方案 对于字符串处理,首选就是正则表达式去处理,而在android系统中可以自定义InputFi ...
最新文章
- Kafka将消息发往内存缓冲区
- [BZOJ 4819] [SDOI 2017] 新生舞会
- 最简单的Evernote,最专业的活用方法 by 电脑玩物站长
- hdu6380(2018 “百度之星”程序设计大赛 - 初赛(B))
- JZOJ 5434. 【NOIP2017提高A组集训10.30】Matrix
- python菜鸟教程split_Python split()方法
- 如何在windows上将本地项目上传到Github
- 【计算机网络】电路交换网络中,每条电路独占其经过的物理链路?
- java jexl_一种表达式语言的解析引擎JEXL简单使用
- Java 线程池 ThreadPoolExecutor源码简析
- 好用到爆!电脑必装软件清单,四款软件工具,一个都绝不能少!让你的电脑瞬间开挂!
- HMS Core 3D精准室内定位技术,打造“店铺级”出行体验
- linux top命令最详细解释
- android 播放器音量,Android应用实例之调节播放器音量——AudioManager的应用
- 多级下料问题的建模 翻译
- exploit-db图文教程
- 周老师,李记者,朱老师
- ios 按钮图片拉伸_iOS中实现图片自适应拉伸效果的方法
- CAS,ReentrantLock和synchronized总结
- 查询数据库dblink
热门文章
- 英雄联盟为什么服务器找不到,英雄联盟为什么连接不上服务器(英雄联盟没有响应是什么...
- “动员商家”策略相继而出,天猫京东吹响“双11”号角
- Python爬取百度网盘的目录
- android 平板一直开机内存不足,手机天天提示内存不足,解决这个问题其实很简单...
- AMD ROCm 平台简介
- 诗情画意谈设计(原创教程)
- 反恐精英服务器维护到几点,CSOL4月22日更新维护公告 停机维护到几点
- 古风修仙美少女-InsCode Stable Diffusion 美图活动一期
- 这样的财务报表分析软件谁不爱!帮你轻松搞定财务问题~
- python:count函数