java储存数据时遇到内容中有Emoji表情,存入数据库报错!
处理方法主要有两个:
一、修改数据库字符集:
这种方法需要的硬性要求就是你的mysql数据库版本5.5以后的。把数据表编码方式改为utf8mb4。这种方法简单省事,但是可能需要重启数据库。不推荐这种方式不推荐。
二、将Emoji表情过滤掉:
既然数据库不能保存,那就直接把这些表情过滤掉。这种情况是损坏客户的个性而让服务更便捷方式。目前很多网站就是这么干的,毕竟效率是关键,你这表情即便保存了,也说不定哪里再次用到,展示不了。
建议做成工具方法,方便实用。
public class EmojiUtils {
private static boolean isEmojiCharacter(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 slipStr Emoji表情替换成的字符串
* @return 过滤后的字符串
*/
public static String filterEmoji(String source,String slipStr) {
if (StringUtils.isBlank(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 (isEmojiCharacter(codePoint)) {
buf.append(codePoint);
} else {
buf.append(slipStr);
}
}
return buf.toString();
}
}
三、引入已经封装好的公共jar包
<dependency>
<groupId>com.vdurmont</groupId>
<artifactId>emoji-java</artifactId>
<version>4.0.0</version>
</dependency>
EmojiParser.parseToAliases(str):直接转换
EmojiParser.parseToAliases(str, FitzpatrickAction):带修改器的转换,修改器可以指定不同的样式
EmojiParser. removeAllEmojis(str):过滤掉字符串内的emoji表情