需求:表情存入数据库
原因:uft8最多可以存储占3个字符的数据,而emoji表情数据是四个字符,因此mysql的utf8无法存储会报错
解决方法:
mysql5.5.3以前版本
1.urlencode转换(缺点:每次存入和取出都要加密和解密,而且一个字符经过处理后变成了12字节)
2.base64加密(缺点:每次存入和取出都要加密和解密,而且一个字符经过处理后变成了6字节)
emoji表情的正则表达式
各种语言的字符串替换方法("[\\x{10000}-\\x{10ffff}\ud800-\udfff]", "");
mysql5.5.3以后版本
1.上面的加密解密同样可以用
2.修改数据库字符集utf8mb4,这个字符集是支持表情存入的
注意:数据库字符集,表字符集自动字符集,当你发现所有字符集都改了,还是不行,那么请你检查下character_set_server utf8mb4 (让数据库允许表情存入---需要重启数据库)
标签转换
/** * @Description 将字符串中的emoji表情转换成可以在utf-8字符集数据库中保存的格式(表情占4个字节,需要utf8mb4字符集) * @param str * 待转换字符串 * @return 转换后字符串 * @throws UnsupportedEncodingException * exception */ public static String emojiConvert1(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) { LOG.error("emojiConvert error", e); throw e; } } matcher.appendTail(sb); LOG.debug("emojiConvert " + str + " to " + sb.toString() + ", len:" + sb.length()); return sb.toString(); } /** * @Description 还原utf8数据库中保存的含转换后emoji表情的字符串 * @param str * 转换后的字符串 * @return 转换前的字符串 * @throws UnsupportedEncodingException * exception */ public static String emojiRecovery2(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) { LOG.error("emojiRecovery error", e); throw e; } } matcher.appendTail(sb); LOG.debug("emojiRecovery " + str + " to " + sb.toString()); return sb.toString(); }