大致有两种解决方案,
第一种:更改表里,字段的字符集属性(以MySQL为例子)
选择utf8mb4即可。
MySQL,varchar的utf8属性如下:
1character=3bytes, 1汉字=2bytes=1character,也就是说varchar(2),能存2个汉字,2个字母。
但是一个表情符号占4bytes,所以在不做任何处理的情况下,将表情符号直接存入数据库,
是会报错的。
utf8mb4,1character=4bytes,但1character依然只能存1个汉字,所以在空间上可能在存在浪费,
但是utf8mb4有更好的兼容性,另外mysql官方字符串推荐使用varchar类型。
第二种:通过编程的方式解决
代码如下:
/**
* @Description emoji表情转换
*
* @param str 待转换字符串
* @return 转换后字符串
* @throws UnsupportedEncodingException
*/
public static String emojiConvertToUtf(String str)
throws UnsupportedEncodingException {
String patternString = "([\\x{10000}-\\x{10ffff}\ud800-\udfff])";
Pattern pattern = Pattern.compile(patternString);
Matcher matcher = pattern.matcher(str);
StringBuffer sb = new StringBuffer();
while (matcher.find()) {
try {
matcher.appendReplacement(
sb,
"[[" + URLEncoder.encode(matcher.group(1),
"UTF-8") + "]]");
} catch (UnsupportedEncodingException e) {
throw e;
}
}
matcher.appendTail(sb);
return sb.toString();
}
/**
* @Description 还原emoji表情的字符串
*
* @param str 转换后的字符串
* @return 转换前的字符串
* @throws UnsupportedEncodingException
*/
public static String utfemojiRecovery(String str)
throws UnsupportedEncodingException {
String patternString = "\\[\\[(.*?)\\]\\]";
Pattern pattern = Pattern.compile(patternString);
Matcher matcher = pattern.matcher(str);
StringBuffer sb = new StringBuffer();
while (matcher.find()) {
try {
matcher.appendReplacement(sb,
URLDecoder.decode(matcher.group(1), "UTF-8"));
} catch (UnsupportedEncodingException e) {
throw e;
}
}
matcher.appendTail(sb);
return sb.toString();
}
至于选那种方案,就看实际情况了