作者:vegg巛iegbaby | 来源:互联网 | 2023-10-12 13:21
开发途中遇到评价的功能,需要存入表情符号比如:
以及这种
存入数据库的时候会抛出异常,\x86\啥的
百度解决办法是 数据库改utf8mb4 但是测试改表的字符集并没有用,
然后我也没敢改库的字符集仍然使用utf8
我的解决办法是代码层面的处理,进行URLEncoder转码 和URLEncoder 解码:
/*** @Description emoji表情转换* @param str 待转换字符串* @return 转换后字符串* @throws UnsupportedEncodingException*/public static String emojiConvertToUtf(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) {throw e;}}matcher.appendTail(sb);log.info("emoji表情转字符串:"+sb.toString());return sb.toString();}/*** @Description 还原emoji表情的字符串** @param str 转换后的字符串* @return 转换前的字符串* @throws UnsupportedEncodingException*/public static String utfemojiRecovery(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) {throw e;}}matcher.appendTail(sb);log.info("字符串转emoji表情:"+sb.toString());return sb.toString();}
注意:
测试时在对象get set方法上转码 解码,存入数据库仍然是失败的
大概是因为mybatis的insert 和 update方法 mapper快捷方法实际处理时仍存入的未转码的
所以在业务代码上进行转码解码的:
/*** 转码 解决表情问题*/try {evaluateContent = StringUtil.emojiConvertToUtf(evaluateContent);} catch (UnsupportedEncodingException e) {throw new BusinessException(CommonErrorCode.E_102906);}
/*** 解码*/try {evaluateContent = StringUtil.utfemojiRecovery(evaluateContent);} catch (UnsupportedEncodingException e) {throw new BusinessException(CommonErrorCode.E_102906);}