问题描述
现在很多用户昵称,用户评论中包含特殊字符串和emoji表情,但是在编码传输的出现问题,导致传输失败,还有Emoji表情是4个字节,而Mysql的utf8编码最多3个字节,所以数据写不进数据库 。
解决方案
我们可以根据正则表达式过滤掉特殊字符串和Emoji表情符号。
代码实现
package com.zcjd.config;import lombok.extern.slf4j.Slf4j;import java.util.regex.Matcher;import java.util.regex.Pattern;/*** @author 凌乱的枫叶* @ClassName StringUtil* @Description 过滤工具包* @createTime -07-19 10:14:00*/@Slf4jpublic class StringUtil {/*** 过滤特殊字符* @param str* @return*/public static String filterStr (String str){String regEx="[`~!@#$%^&*()+=|{}':;',\\[\\].<>/?~!@#¥%……&*()——+|{}【】‘;:”“’。,、?]";Pattern p = pile(regEx);Matcher m = p.matcher(str);return m.replaceAll("").trim();}/*** 过滤emoji表情,将表情替换成** @param source* @return*/public static String filterEmoji(String source) {if(source != null) {Pattern emoji = pile("[\ud83c\udc00-\ud83c\udfff]|[\ud83d\udc00-\ud83d\udfff]|[\u2600-\u27ff]|" +"[\ud83e\udd00-\ud83e\uddff]|[\u2300-\u23ff]|[\u2500-\u25ff]|[\u2100-\u21ff]|[\u00a0-\u0fff]|[\u2b00-\u2bff]|[\u2d06]|[\u3030]",Pattern.UNICODE_CASE | Pattern.CASE_INSENSITIVE ) ;Matcher emojiMatcher = emoji.matcher(source);if (emojiMatcher.find()) {source = emojiMatcher.replaceAll("*");return source ;}return source;}return source;}/*** 过滤表情符号* @param content* @return*/public static String filterEmoji2(String content) {StringBuilder sb = new StringBuilder();for (char ch : content.toCharArray()) {if (!Character.isHighSurrogate(ch) && !Character.isLowSurrogate(ch)) {sb.append(ch);}}if (sb.length() < content.length()) {log.info(content.length() + " 过滤掉 " + sb.length());}return sb.toString();}}