emoji表情特殊字元出錯處理
阿新 • • 發佈:2019-02-04
問題描述
第三方登入時,微信暱稱和QQ暱稱包含表情符或特殊字元,儲存到mysql資料庫時,會報錯。
解決方案如下
第一,修改資料庫字符集:
這種方法需要的硬性要求就是你的mysql資料庫版本5.5以後的。一般有資料庫管理工具的,直接開啟改了就是了,比如我用的Navicat for MySQL,直接把表改為utf8mb4 -- UTF-8 Unicode就可以了。這種方法簡單省事,但是可能需要重啟資料庫。還有個問題是,有時候這方法不太靈。
第二,將這些表情過濾掉
既然資料庫不能儲存,那就直接把這些表情過濾掉好了。這種情況是損壞客戶的個性而讓服務更便捷的一張方式。目前很多網站就是這麼處理的,畢竟效率是關鍵,你這表情即便儲存了,也說不定哪裡再次用到,展示不了。所以還是過濾emoji字元吧。
過濾工具類簡單DEMO
package com.util; import org.apache.commons.lang.StringUtils; public class SLEmojiFilter { /** * 檢測是否有emoji字元 * * @param source * @return 一旦含有就丟擲 */ public static boolean containsEmoji(String source) { if (StringUtils.isBlank(source)) { return false; } int len = source.length(); for (int i = 0; i < len; i++) { char codePoint = source.charAt(i); if (isEmojiCharacter(codePoint)) { // do nothing,判斷到了這裡表明,確認有表情字元 return true; } } return false; } 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 * @return */ public static String filterEmoji(String source) { source = source.replaceAll("[\\ud800\\udc00-\\udbff\\udfff\\ud800-\\udfff]", "*"); if (!containsEmoji(source)) { return source;// 如果不包含,直接返回 } // 到這裡鐵定包含 StringBuilder buf = null; int len = source.length(); for (int i = 0; i < len; i++) { char codePoint = source.charAt(i); if (isEmojiCharacter(codePoint)) { if (buf == null) { buf = new StringBuilder(source.length()); } buf.append(codePoint); } else { buf.append("*"); } } if (buf == null) { return source;// 如果沒有找到 emoji表情,則返回源字串 } else { if (buf.length() == len) {// 這裡的意義在於儘可能少的toString,因為會重新生成字串 buf = null; return source; } else { return buf.toString(); } } } }
參考資料: