Android中emoji的处理以及和iOS端互通


因为项目中有第三方登录,微信昵称有带有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

demo截图


android互助群:



猜你喜欢

转载自blog.csdn.net/qq_35698774/article/details/79142099