Emoji表情特殊文字エラー処理

2405 ワード

問題の説明
サードパーティがログインすると、微信ニックネームとQQニックネームには表情文字や特殊文字が含まれており、mysqlデータベースに格納されている場合、エラーが発生します.
ソリューションは次のとおりです.
まず、データベース文字セットを変更します.
この方法に必要なハードな要件は、mysqlデータベースのバージョン5.5以降です.一般的にデータベース管理ツールがあるので、直接開けて変更すればいいです.例えば、私が使っているNavicat for MySQLでは、テーブルをutf 8 mb 4--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();
			}
		}

	}
}

参考資料:
1. http://www.itmayun.com/it/files/226631678709806/article/406117164733730/1.html