1,在APP开发中,大多需要涉及表情符号丰富APP的亲和力,但是因为我们的数据库一般是utf8编码,是3个字节,而表情符号基本都是四个字节的unicode编码。以下是通过emoji-Java解决数据库不能存储4字节表情符号的问题。
2,在你的pom文件中导入以下坐标,可能不是最新的,需要最新的请到github搜索
<dependency> <groupId>com.vdurmont</groupId> <artifactId>emoji-Java</artifactId> <version>3.1.3</version> </dependency>
4,用到的检测是否有表情符号的工具类
package com.lcm.up.nweb2.common.uitls; import java.util.List; import com.vdurmont.emoji.EmojiParser; public class EmojiDealUtil extends EmojiParser { /** * 获取非表情字符串 * @param input * @return */ public static String getNonEmojiString(String input) { int prev = 0; StringBuilder sb = new StringBuilder(); List<UnicodeCandidate> replacements = getUnicodeCandidates(input); for (UnicodeCandidate candidate : replacements) { sb.append(input.substring(prev, candidate.getEmojiStartIndex())); prev = candidate.getFitzpatrickEndIndex(); } return sb.append(input.substring(prev)).toString(); } /** * 获取表情字符串 * @param input * @return */ public static String getEmojiUnicodeString(String input){ EmojiTransformer transformer = new EmojiTransformer() { public String transform(UnicodeCandidate unicodeCandidate) { return unicodeCandidate.getEmoji().getHtmlHexadecimal(); } }; StringBuilder sb = new StringBuilder(); List<UnicodeCandidate> replacements = getUnicodeCandidates(input); for (UnicodeCandidate candidate : replacements) { sb.append(transformer.transform(candidate)); } return parseToUnicode(sb.toString()); } public static String getUnicode(String source){ String returnUniCode=null; String uniCodeTemp=null; for(int i=0;i<source.length();i++){ uniCodeTemp = "\u"+Integer.toHexString((int)source.charAt(i)); returnUniCode=returnUniCode==null?uniCodeTemp:returnUniCode+uniCodeTemp; } return returnUniCode; } }
5,附加,可能用到的其他处理表情的工具类
package com.lcm.up.nweb2.common.uitls; import org.apache.commons.lang3.StringUtils; /** * 表情处理工具 * @ClassName: FilterEmojiUtil * </p> * @author chenxingfei * @date 2017年4月7日 上午9:59:49 * */ public class FilterEmojiUtil { /** * 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; } } }
6,emoji-Java使用
//转换表情 if(StringUtils.isNotBlank(EmojiDealUtil.getEmojiUnicodeString("被检测内容"))){ String hexadecimal = EmojiParser.parseToHtmlHexadecimal(“将被检测内容中的表情符号替换为表情符号的html的十六进制和数据,类似于😉”); taskPaidInteractVo.setInteractContent(hexadecimal); }
反解析,将存入数据库的😉转换为表情对应的4字节Unicode编码,这样移动端才能识别
//转换表情 String interactContent = EmojiParser.parseToUnicode("被转换内容,会将html的十六进制和数据转换为表情对应的4字节Unicode编码"); interactVo.setInteractContent(interactContent );
7,emoji-Java提供了多种转换方式,同列举的就一种,其他的也类似
---------------------
作者:Itxingfeichen
来源:CSDN
原文:https://blog.csdn.net/xingfeichen/article/details/69948573
版权声明:本文为博主原创文章,转载请附上博文链接!