最强特殊字符、表情符号、Unicdeo字符串处理
处理效果:
将特殊字符、表情符号 替换成空格
Unicode编码字符串 转义
重音字符原样保留
/**
* @param: str
* @description: 处理可能包含unicode的字符串
* 如"?\u0006 \u0000\u0019\u0000\"" 这样含有这样错误的unicode的字符串是可以存入数据库,并导致乱码。
* 入参 ?\u0006 \u0000\u0019\u0000\" 返回结果?\\u0006 \\u0000\\u0019\\u0000\\\"
* n\u0005\ufffd\u0000 n\u0007\u0005\u0019w\u0000
* aaasadf,sdfn� nw 你好111xiekai@#$,.ẨẩẪẫẬậ
* "123@#$,._-!@#$%^&*()+-AQÀÁÂÃÈÉÊÌÍÐÑÒÓÔÕÙÚÝàáâãåèéêìíñòóôõùúüýĂăĐđĨĩŨũūƠơƯự̀́̃̉ẠạẢảẤấẦầẨẩẪẫẬậẮắẰằẲẳẴẵẶặẸẹẺẻẼẽẾếỀềỂểỄễỆệỈỉỊịỌọỎỏỐốỒồỔổỖỗỘộỚớỜờỞởỠỡỢợỤụỦủỨứỪừỬửỮữỰựỲỳỴỵỶỷỸỹ₫ạ𝑴𝒆𝒈𝒂𝒓𝒊𝒂dzaki ẨẩẪẫẬậ \u0005\ufffd\u0000 n\u0007\u0005\u0019w\u0000你好111 ramatullah\uD83D\uDE0Edzaki ramatullah😎";
* @return: java.lang.String
* @author: xk
* @date: 2021/4/20 19:24
*/
public static String handleUnicodeStr(String str) {
if (str == null) {
return null;
}
try {
str = str.replaceAll("[\\ud800\\udc00-\\udbff\\udfff\\ud800-\\udfff]", " ");//emoji表情、特殊字体替换空格
String backStr = replaceUnicode(str);
return backStr;
} catch (Exception e) {
log.error("handleUnicodeStr get exception", e);
return str;
}
}
/**
* @param: sourceStr
* @description: 将unicode的字符转义
* @return: java.lang.String
* @author: xk
* @date: 2021/5/11 14:26
*/
public static String replaceUnicode(String sourceStr) {
StringBuffer stringBuffer = new StringBuffer();
//[\p{Ll}\p{Lu}\p{Lt}\p{Lo}\p{Lm}\p{Nd}\p{Pc}]对应 [0-9a-zA-Z_] {P}任何类型的标点符号。 {M}重音符号,变音符号,封闭框等 p{Sc}任何货币符号。
Pattern pattern = Pattern.compile("[^\\p{Ll}\\p{Lu}\\p{Lt}\\p{Lo}\\p{Lm}\\p{Nd}\\p{Pc}\\p{P}\\p{M}\\p{Sc}]");
Matcher matcher = pattern.matcher(sourceStr);
while (matcher.find()) {
matcher.appendReplacement(stringBuffer, java.util.regex.Matcher.quoteReplacement((StringEscapeUtils.escapeJava(matcher.group()))));
}
matcher.appendTail(stringBuffer);
return stringBuffer.toString();
}
知识点
a.通过Unicode来匹配字符,从而做到通用
参考:https://www.regular-expressions.info/unicode.html
b.StringEscapeUtils.escapeJava 转义Unicode。