Emoji表情转换

/**
 *
 * @author Administrator
 */
public class EmojiUtil {
    /**
    * @Description 将字符串中的emoji表情转换成可以在utf-8字符集数据库中保存的格式(表情占4个字节,需要utf8mb4字符集)
    * @param str
    * 待转换字符串
    * @return 转换后字符串
    * @throws UnsupportedEncodingException
    * exception
    */
    public static String emojiConvert1(String str) throws UnsupportedEncodingException {
        String patternString = "([\\x{10000}-\\x{10ffff}\ud800-\udfff])";


        Pattern pattern = Pattern.compile(patternString);
        Matcher matcher = pattern.matcher(str);
        StringBuffer sb = new StringBuffer();
        while(matcher.find()) {
            try {
                matcher.appendReplacement(
                sb,
                "[["
                + URLEncoder.encode(matcher.group(1),
                "UTF-8") + "]]");
            } catch(UnsupportedEncodingException e) {
                e.printStackTrace();
               throw e;
            }
        }
        matcher.appendTail(sb);
        System.out.println("emojiConvert " + str + " to " + sb.toString()
        + ", len:" + sb.length());
        return sb.toString();
    }


    /**
    * @Description 还原utf8数据库中保存的含转换后emoji表情的字符串
    * @param str
    * 转换后的字符串
    * @return 转换前的字符串
    * @throws UnsupportedEncodingException
    * exception
    */
    public static String emojiRecovery2(String str) throws UnsupportedEncodingException {
        String patternString = "\\[\\[(.*?)\\]\\]";


        Pattern pattern = Pattern.compile(patternString);
        Matcher matcher = pattern.matcher(str);


        StringBuffer sb = new StringBuffer();
        while(matcher.find()) {
            try {
                matcher.appendReplacement(sb,
                URLDecoder.decode(matcher.group(1), "UTF-8"));
            } catch(UnsupportedEncodingException e) {
                e.printStackTrace();
                throw e;
            }
        }
        matcher.appendTail(sb);
        System.out.println("emojiRecovery " + str + " to " + sb.toString());
        return sb.toString();
    }
    
    /**
     *  判断字符串中是否包含emoji表情符及其他特殊字符
     *  @param source 原字符串
     */
    public static boolean containsEmoji(String source) {
        int len = source.length();
        boolean isEmoji = false;
        for (int i = 0; i < len; i++) {
            char hs = source.charAt(i);
            if (0xd800 <= hs && hs <= 0xdbff) {
                if (source.length() > 1) {
                    char ls = source.charAt(i+1);
                    int uc = ((hs - 0xd800) * 0x400) + (ls - 0xdc00) + 0x10000;
                    if (0x1d000 <= uc && uc <= 0x1f77f) {
                        return true;
                    }
                }
            } else {
                // non surrogate
                if (0x2100 <= hs && hs <= 0x27ff && hs != 0x263b) {
                    return true;
                } else if (0x2B05 <= hs && hs <= 0x2b07) {
                    return true;
                } else if (0x2934 <= hs && hs <= 0x2935) {
                    return true;
                } else if (0x3297 <= hs && hs <= 0x3299) {
                    return true;
                } else if (hs == 0xa9 || hs == 0xae || hs == 0x303d || hs == 0x3030 || hs == 0x2b55 || hs == 0x2b1c || hs == 0x2b1b || hs == 0x2b50|| hs == 0x231a ) {
                    return true;
                }
                if (!isEmoji && source.length() > 1 && i < source.length() -1) {
                    char ls = source.charAt(i+1);
                    if (ls == 0x20e3) {
                        return true;
                    }
                }
            }
        }
        return  isEmoji;
    }
    
     private static boolean isEmojiCharacter(char codePoint) {
        return (codePoint == 0x0) || (codePoint == 0x9) || (codePoint == 0xA)
                || (codePoint == 0xD)
                || ((codePoint >= 0x20) && (codePoint <= 0xD7FF))
                || ((codePoint >= 0xE000) && (codePoint <= 0xFFFD))
                || ((codePoint >= 0x10000) && (codePoint <= 0x10FFFF));
    }
     /**
      * 过滤emoji 或者 其他非文字类型的字符
      * 
      * @param source
      * @return
      */
     public static String filterEmoji(String source) {
         if (StringUtils.isBlank(source)) {
             return source;
         }
         StringBuilder buf = null;
         int len = source.length();
         for (int i = 0; i < len; i++) {
             char codePoint = source.charAt(i);
             if (isEmojiCharacter(codePoint)) {
                 if (buf == null) {
                     buf = new StringBuilder(source.length());
                 }
                 buf.append(codePoint);
             }
         }
         if (buf == null) {
             return source;
         } else {
             if (buf.length() == len) {
                 buf = null;
                 return source;
             } else {
                 return buf.toString();
             }
         }

     }

}

Python 玩转 Emoji 表情,首先需要了解 Emoji 的 Unicode 编码。 Emoji 表情其实是由 Unicode 编码规定的,每个 Emoji 表情对应着一个 Unicode 编码。Python 通过 Unicode 编码来识别和处理 Emoji 表情。 举个例子,比如常见的微笑表情,它的 Unicode 编码是 “😊” 对应的 UTF-8 编码是“F0 9F 98 8A”。Python 中可以通过 Unicode 编码来表示这个 Emoji 表情,代码为 u"\U0001F60A"。 虽然在 Python3 中默认支持 Unicode,但是为了确保在各种环境中的正常运行,我们需要使用 emoji 模块来操作 Emoji 表情。 在使用 emoji 模块时,首先需要安装,可以使用 pip 包管理工具进行安装,在 Python 中通过 import 引入这个emoji 模块,然后就可以通过 emoji.emojize() 方法来将 Unicode 转换成对应的 Emoji 表情了,同时 emoji.demojize() 方法可以将 Emoji 表情转换成对应的 Unicode 编码。 接下来我们可以使用这个模块来实现一些简单的 Emoji 表情操作。 比如我们可以使用下面这段代码来输出一句话,并添加一个微笑表情: from emoji import emojize print(emojize("大家好! :smile:")) 运行效果如下: 大家好! 😊 除了普通的 Emoji 表情外,emoji 模块还支持一些表情的组合,如使用 emoij.emojize(":thumbs_up: :skin-tone-2:") 可以得到一个带有中等肤色点赞的 Emoji 表情。 总之,Python 可以很方便的处理 Emoji 表情emoji 模块为我们提供了很好的支持,如有需要还可以自定义 Emoji 表情,玩转 Emoji,让您的 Python 更加生动有趣。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值