緣由:uft8最多能夠存儲佔3個字符的數據,而emoji表情數據是四個字符,所以mysql的utf8沒法存儲會報錯java
1.urlencode轉換(缺點:每次存入和取出都要加密和解密,並且一個字符通過處理後變成了12字節)mysql
2.base64加密(缺點:每次存入和取出都要加密和解密,並且一個字符通過處理後變成了6字節)正則表達式
各類語言的字符串替換方法("[\\x{10000}-\\x{10ffff}\ud800-\udfff]", "");
1.上面的加密解密一樣能夠用sql
2.修改數據庫字符集utf8mb4,這個字符集是支持表情存入的數據庫
注意:數據庫字符集,表字符集自動字符集,當你發現全部字符集都改了,仍是不行,那麼請你檢查下character_set_server utf8mb4 (讓數據庫容許表情存入---須要重啓數據庫)app
/** * @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(); }