1. 程式人生 > >emoji表情特殊字元出錯處理

emoji表情特殊字元出錯處理

問題描述

第三方登入時,微信暱稱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();
			}
		}

	}
}

參考資料: