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