在記錄用戶從app傳過來的信息時可能會帶有emoji表情符,可是MySql存儲不了,保存時會報異常,想讓MySql存儲emoji表情能夠將數據庫的字符集調整爲utf8mb4格式,可是隻有5.5.3以上的版本纔會有這樣的編碼,可是總不能爲了這麼個表情升級服務器的數據庫,可使用工具類進行轉換,存儲的時候轉換一次,取出來之後再轉換回來便可解決這個問題java
public class EmojiUtil { /** * 將str中的emoji表情轉爲byte數組 * * @param str * @return */ public static String resolveToByteFromEmoji(String str) { Pattern pattern = Pattern .compile("[^(\u2E80-\u9FFF\\w\\s`~!@#\\$%\\^&\\*\\(\\)_+-?()——=\\[\\]{}\\|;。,、《》」:;「!……’:'\"<,>\\.?/\\\\*)]"); Matcher matcher = pattern.matcher(str); StringBuffer sb2 = new StringBuffer(); while (matcher.find()) { matcher.appendReplacement(sb2, resolveToByte(matcher.group(0))); } matcher.appendTail(sb2); return sb2.toString(); } /** * 將str中的byte數組類型的emoji表情轉爲正常顯示的emoji表情 * * @param str * @return */ public static String resolveToEmojiFromByte(String str) { Pattern pattern2 = Pattern.compile("<:([[-]\\d*[,]]+):>"); Matcher matcher2 = pattern2.matcher(str); StringBuffer sb3 = new StringBuffer(); while (matcher2.find()) { matcher2.appendReplacement(sb3, resolveToEmoji(matcher2.group(0))); } matcher2.appendTail(sb3); return sb3.toString(); } private static String resolveToByte(String str) { byte[] b = str.getBytes(); StringBuffer sb = new StringBuffer(); sb.append("<:"); for (int i = 0; i < b.length; i++) { if (i < b.length - 1) { sb.append(Byte.valueOf(b[i]).toString() + ","); } else { sb.append(Byte.valueOf(b[i]).toString()); } } sb.append(":>"); return sb.toString(); } private static String resolveToEmoji(String str) { str = str.replaceAll("<:", "").replaceAll(":>", ""); String[] s = str.split(","); byte[] b = new byte[s.length]; for (int i = 0; i < s.length; i++) { b[i] = Byte.valueOf(s[i]); } return new String(b); } /** * 將byte數組類型的emoji表情替換爲指定的字符串 * * @param str * @param replace * @return */ public static String replaceEmojiFromByte(String str, String replace) { return str.replaceAll("<:([[-]\\d*[,]]+):>", replace); } }