UTF-8编码有可能是两个、三个、四个字节。Emoji表情是4个字节,而Mysql的utf8编码最多3个字节,所以数据插不进去。
解决方案:
1.将已经建好的表也转换成utf8mb4,这个方法不可行,有的时候就不灵了。
- 替换成问号: EmojiFilter.filterEmoji(str, “?”);
import org.apache.commons.lang3.StringUtils;
/**
* 表情符号替换
*/
public class EmojiFilter {
/**
* 检测是否有emoji字符
*
* @param source
* @return 一旦含有就抛出
*/
public static boolean containsEmoji(String source) {
if (StringUtils.isBlank(source)) {
return false;
}
int len = source.length();
for (int i = 0; i < len; i++) {
char codePoint = source.charAt(i);
if (!isNotEmojiCharacter(codePoint)) {
//判断到了这里表明,确认有表情字符
return true;
}
}
return false;
}
/**
* 判断是否为非Emoji字符
*
* @param codePoint 比较的单个字符
* @return
*/
private static boolean isNotEmojiCharacter(char codePoint) {
return (codePoint == 0x0) ||
(codePoint == 0x9) ||
(codePoint == 0xA) ||
(codePoint == 0xD) ||
((codePoint >= 0x20) && (codePoint <= 0xD7FF)) ||
((codePoint >= 0xE000) && (codePoint <= 0xFFFD)) ||
((codePoint >= 0x10000) && (codePoint <= 0x10FFFF));
}
/**
* 过滤emoji 或者 其他非文字类型的字符
*
* @param source
* @param replaceStr 替换的字符,为null的话只是简单的过滤
* @return
*/
public static String filterEmoji(String source, String replaceStr) {
if (StringUtils.isBlank(source)) {
return source;
}
if (!containsEmoji(source)) {
return source;//如果不包含,直接返回
}
StringBuilder buf = new StringBuilder(source.length());
int len = source.length();
for (int i = 0; i < len; i++) {
char codePoint = source.charAt(i);
if (isNotEmojiCharacter(codePoint)) {
buf.append(codePoint);
}else if (replaceStr!= null){
buf.append(replaceStr);
}
}
return buf.toString().trim();
}
}