因为项目中有第三方登录,微信昵称有带有emoji 。想要完美的展示出来就需要重新编码,而且还要考虑到和iOS 的互通。
首先是拿到字符串判断有没有emoji表情。有的话对其进行编码。展示的时候先要判断有没有编码后的emoji,有的话还原在展示。
在判断的时候先要对字符串转换成字符数组。每一个字符在转化成Unicode编码(toCodePoint)拿着这个编码和emoji的Unicode编码表对比如果有相同的把这个编码转换成String类型的。这个就是转化好的编码,但是为了和iOS互通以及再把这个编码转换回emoji需要在这个新的字符串添加一个标记我们添加的是“[U+转换成string类型的Unicode编码]”
展示的时候先遍历这个字符串包不包含自己的标识“[U+ ]”包含就认定里面的数据是一个emoji 取出里面的数据转换回来(Character.toChars(把转换成Unicode的string字符串转化成int类型))
以上就是大概思路,剩下的直接上代码:
/** * 把带有表情的转换成unicode编码 * * @param input * @return */ public static String emoji2string(String input) { if (input == null) { return input; } final char[] chars = input.toCharArray(); final StringBuilder sb = new StringBuilder(); int codePoint; boolean isSurrogatePair; for (int i = 0; i < chars.length; i++) { if (Character.isHighSurrogate(chars[i])) { continue; } else if (Character.isLowSurrogate(chars[i])) { if (i > 0 && Character.isSurrogatePair(chars[i - 1], chars[i])) { codePoint = Character.toCodePoint(chars[i - 1], chars[i]); isSurrogatePair = true; } else { continue; } } else { codePoint = (int) chars[i]; isSurrogatePair = false; } if (isEmoji(codePoint)) { sb.append("[U+" + Integer.toHexString(codePoint) + "]"); } else { sb.append(new String(Character.toChars(codePoint))); } } return sb.toString(); }
/** * unicode编码的string字符串转换成表情 * * @param input1 * @return */ public static String string2emoji(CharSequence input1) { String input = input1.toString(); StringBuilder sb = new StringBuilder(); //我 我[U+1f616]你 20 for (int i = 0; i < input.length(); i++) { if (input.indexOf("[U+") != -1 && input.indexOf("]") != -1) { int end = input.indexOf("]"); int star = input.indexOf("[U+"); sb.append(input.substring(0, star)); String substring = input.substring(input.indexOf("[U+") + 3, end); sb.append(new String(Character.toChars(Integer.parseInt(substring, 16)))); input = input.substring(end + 1); Log.d("TAG", "input" + input); i = -1; } else { Log.d("TAG", "input1" + input); sb.append(input); break; } } return sb.toString(); }
/** * 判断 * @param codePoint * @return */ public static boolean isEmoji(int codePoint) { return codePoint == 0x00A9 || codePoint == 0x00AE || codePoint == 0x2002 || ... codePoint == 0x2005 || codePoint == 0x203C || codePoint == 0x2049 || ... 太多了这里就不都展示了,完整的代码看demo吧。 codePoint == 0x1F6BD || codePoint == 0x1F6BE || codePoint == 0x1F6C0; }
demo截图
android互助群: