目录
在APP开发中,大多需要涉及表情符号丰富APP,但是因为我们的数据库一般是utf8编码,是3个字节,而表情符号基本都是四个字节的unicode编码。以下是通过emoji-Java解决数据库不能存储4字节表情符号的问题。
以前也写过类似的:java过滤微信昵称特殊字符,没有用工具包,直接过滤了,现在是要保存的
pom依赖
<dependency> <groupId>com.vdurmont</groupId> <artifactId>emoji-java</artifactId> <version>3.1.3</version> </dependency>
java工具类
import com.vdurmont.emoji.EmojiParser; import org.apache.commons.lang.StringUtils; import java.util.List; /** * 表情处理工具 * * @Author: szw * @Date: 2020/9/15 11:27 */ public class FilterEmojiUtil extends EmojiParser { /** * 获取非表情字符串 * * @param input String * @return String */ public static String getNonEmojiString(String input) { int prev = 0; StringBuilder sb = new StringBuilder(); List<EmojiParser.UnicodeCandidate> replacements = getUnicodeCandidates(input); for (EmojiParser.UnicodeCandidate candidate : replacements) { sb.append(input.substring(prev, candidate.getEmojiStartIndex())); prev = candidate.getFitzpatrickEndIndex(); } return sb.append(input.substring(prev)).toString(); } /** * 获取表情字符串 * * @param input String * @return String */ public static String getEmojiUnicodeString(String input) { EmojiParser.EmojiTransformer transformer = unicodeCandidate -> unicodeCandidate.getEmoji().getHtmlHexadecimal(); StringBuilder sb = new StringBuilder(); List<EmojiParser.UnicodeCandidate> replacements = getUnicodeCandidates(input); for (EmojiParser.UnicodeCandidate candidate : replacements) { sb.append(transformer.transform(candidate)); } return parseToUnicode(sb.toString()); } public static String getUnicode(String source) { String returnUniCode = null; String uniCodeTemp; for (int i = 0; i < source.length(); i++) { uniCodeTemp = "\\u" + Integer.toHexString(source.charAt(i)); returnUniCode = returnUniCode == null ? uniCodeTemp : returnUniCode + uniCodeTemp; } return returnUniCode; } /** * emoji表情替换 * * @param source 原字符串 * @param slipStr emoji表情替换成的字符串 * @return 过滤后的字符串 */ public static String filterEmoji(String source, String slipStr) { if (StringUtils.isNotBlank(source)) { return source.replaceAll("[\\ud800\\udc00-\\udbff\\udfff\\ud800-\\udfff]", slipStr); } else { return source; } } /** * 判断是否包含emoji表情 * * @param source 原字符串 * // @param slipStr emoji表情替换成的字符串 * @return 过滤后的字符串 */ public static boolean checkEmoji(String source) { if (StringUtils.isNotBlank(source)) { return source.matches("[\\ud800\\udc00-\\udbff\\udfff\\ud800-\\udfff]"); } else { return false; } } public static void main(String[] args) { String content = "带表情的\uD83D\uDE41\uD83D\uDE2B\uD83E\uDD14\uD83D\uDE10"; System.out.println(getEmojiUnicodeString(content)); //转换表情 if (StringUtils.isNotBlank(getEmojiUnicodeString(content))) { String hexadecimal = EmojiParser.parseToHtmlHexadecimal(content); System.out.println(hexadecimal); //转换表情 String interactContent = EmojiParser.parseToUnicode(hexadecimal); System.out.println(interactContent); } } }
测试
Java Url编码转换
public static String getURLEncoderString(String str) { String result = ""; if (null == str) { return ""; } try { result = java.net.URLEncoder.encode(str, "UTF-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } return result; } public static String URLDecoderString(String str) { String result = ""; if (null == str) { return ""; } try { result = java.net.URLDecoder.decode(str, "UTF-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } return result; }
java后台处理APP表情-使用轻量工具emoji-java处理emoji表情字符
最新推荐文章于 2024-06-06 09:56:59 发布