java 过滤特殊字符串和emoji表情符号
时间:2023-12-01 13:37:04
问题描述
如今,许多用户昵称包括特殊字符串和用户评论emoji表情,但是编码传输的问题导致传输失败,还有Emoji表情是四个字节,而且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 2022-07-19 10:14:00 */ @Slf4j public class StringUtil {
/** * 过滤特殊字符 * @param str * @return */ public static String filterStr (String str){
String regEx="[`~!@#$%^&*() =|\\[\\].<>/?~!@#¥%……&*()—— |{}"; Pattern p = Pattern.compile(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 = Pattern.compile(
"[\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
(
)
;
}
}