android 表情转化,android 表情emoil转化

news/2025/2/12 22:53:24/

sogo 输入法等输入表情,在程序中如何转化为可上传为服务器的字符串,以及从服务器取下字符串如何转化成表情显示

因为emoji是有表情分组的,所以你要优先考虑解析出来的也是分好组的。

HashMap> emoMap = new HashMap>();

我是这么来分组的。

解析xml,然后把2600这样的字符串转换成unicode。这个很关键,映射对应不上肯定也解析不出来。要注意的一点是有的emoji是两个unicode组成的  U+1F1F0 U+1F1F7  这样。。所以么。又多了一个环节。

HashMap, String> convertMap = new HashMap, String>();

再定义一个map来存unicode和string字符的映射。

解析emoji.xml文件,获取表情分组

public void readMap(Context mContext) {

if (convertMap == null || convertMap.size() == 0) {

convertMap = new HashMap, String>();

XmlPullParser xmlpull = null;

String fromAttr = null;

String key = null;

ArrayList emos = null;

try {

XmlPullParserFactory xppf = XmlPullParserFactory.newInstance();

xmlpull = xppf.newPullParser();

InputStream stream = mContext.getAssets().open("emoji.xml");

xmlpull.setInput(stream, "UTF-8");

int eventCode = xmlpull.getEventType();

while (eventCode != XmlPullParser.END_DOCUMENT) {

switch (eventCode) {

case XmlPullParser.START_DOCUMENT: {

break;

}

case XmlPullParser.START_TAG: {

if (xmlpull.getName().equals("key")) {

emos = new ArrayList();

key = xmlpull.nextText();

}

if (xmlpull.getName().equals("e")) {

fromAttr = xmlpull.nextText();

emos.add(fromAttr);

List fromCodePoints = new ArrayList();

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);

}

break;

}

case XmlPullParser.END_TAG: {

if (xmlpull.getName().equals("dict")) {

emoMap.put(key, emos);

}

break;

}

case XmlPullParser.END_DOCUMENT: {

Log.d("", "parse emoji complete");

break;

}

}

eventCode = xmlpull.next();

}

} catch (Exception e) {

Log.e(TAG, e.toString(), e);

}

}

}

输入内容解析为 字符串,即可上传至服务器

public String parseEmoji(String input) {

if (input == null || input.length() <= 0) {

return "";

}

StringBuilder result = new StringBuilder();

int[] codePoints = toCodePointArray(input);

List key = null;

for (int i = 0; i < codePoints.length; i++) {

key = new ArrayList();

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();

}

服务器获取的表情字符串 需要转化成图片表情 ,根据表情id 找到对应图片

/**

* 对spanableString进行正则判断,如果符合要求,则以表情图片代替

*/

public static void dealExpression(Context context, SpannableString spannableString, Pattern patten, int start)

throws Exception {

Matcher matcher = patten.matcher(spannableString);

while (matcher.find()) {

String key = matcher.group();

Log.d("Key", key);

if (matcher.start() < start) {

continue;

}

Field field = R.drawable.class.getDeclaredField("emoji_"

+ key.substring(key.indexOf("]") + 1, key.lastIndexOf("[")));

int resId = Integer.parseInt(field.get(null).toString());

if (resId != 0) {

Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), resId);

ImageSpan imageSpan = new ImageSpan(bitmap);

int end = matcher.start() + key.length();

spannableString.setSpan(imageSpan, matcher.start(), end, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);

if (end < spannableString.length()) {

dealExpression(context, spannableString, patten, end);

}

break;

}

}

}


http://www.ppmy.cn/news/167614.html

相关文章

卖家考核分级 竞品分析

1 分析背景及目的 1.1 分析背景 1&#xff09;平台卖家数量不断增多&#xff0c;已存在大量本地/跨境卖家。特别对于本地卖家&#xff0c;缺乏丰富的电商运营经验&#xff0c;需要平台引导帮助中小型卖家成长&#xff1b; 2&#xff09;随着平台的发展&#xff0c;卖家逐渐出…

[Halcon3D] 3D重要算子及简单处理点云模型求高度示例讲解

&#x1f4e2;博客主页&#xff1a;https://loewen.blog.csdn.net&#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;本文由 丶布布原创&#xff0c;首发于 CSDN&#xff0c;转载注明出处&#x1f649;&#x1f4e2;现…

LLM时代,探索式数据分析的升级之路有哪些新助攻?

在这个信息爆炸的时代&#xff0c;数据已经成为我们生活、工作中不可或缺的重要资源。大量的数据犹如一座座金矿&#xff0c;蕴藏着无尽的价值。然而&#xff0c;如果无法从数据中提取出知识和信息并加以有效利用&#xff0c;那么数据本身并不能驱动和引领技术应用取得成功。如…

笔记本13槽PCI卡扩展坞 P13R

美国原装笔记本13槽PCI卡扩展坞可使您的笔记本电脑可以同时使用13个PCI设备。 PCI十三槽笔记本扩展坞可将13块PCI卡&#xff08;全长卡或半长卡&#xff09;通过Cardbus或ExpressCard接口驳接到笔记本电脑上&#xff0c;并且速度无衰减&#xff08;当使用T型或者E型卡&#xff…

以太网网卡历史-3com,intel及其它

转载于&#xff1a;http://we.pcinlife.com/forum.php?modviewthread&tid568940 Gz不存在了&#xff0c;但是我觉得探索真知的精神还是在每一个GZer的心中&#xff0c;这正是GZ不同于国内其它论坛的地方。我新开一帖&#xff0c;集中解决一些Intel百兆网卡使用上的问题&am…

从串口驱动到Linux驱动模型

大学的时候&#xff0c;帮朋友写的操作系统调研的作业&#xff0c;最近整理过去的文档时候偶然发现&#xff0c;遂作为博客发出来。 从串口驱动到Linux的tty子系统驱动模型简要分析 基于ARM920T核心 Samsung的S3C2440芯片 本文通过对Linux下串口驱动的分析。由最上层的C库。到操…

黑苹果折腾日记

电脑配置 电脑型号 联想 Lenovo 天逸 310-15IKB 笔记本电脑 操作系统 Windows 10 专业版 64位&#xff08;Version 21H2 / DirectX 12&#xff09; 处理器 英特尔 Core i5-7200U 2.50GHz 双核 主板 联想 LNVNB161216&#xff08;7th Generation Intel Processor Family I/O - …

计算机wifi共享怎么设置,笔记本电脑设置wifi热点共享教程

windows xp 方法一,IP法 笔记本做手机wifi热点超详细图文之【XP教程】 手机端的连接方法我就不多说了,大家应该都会。 以下的设置方法是在这样的环境里适用: 你的笔记本有两块网卡,一块有线,一块无线,一个有线路由器,笔记本和有线路由器通过网线连接。 如何让笔记本成为…