Emoji表情特殊文字エラー処理
2405 ワード
問題の説明
サードパーティがログインすると、微信ニックネームとQQニックネームには表情文字や特殊文字が含まれており、mysqlデータベースに格納されている場合、エラーが発生します.
ソリューションは次のとおりです.
まず、データベース文字セットを変更します.
この方法に必要なハードな要件は、mysqlデータベースのバージョン5.5以降です.一般的にデータベース管理ツールがあるので、直接開けて変更すればいいです.例えば、私が使っているNavicat for MySQLでは、テーブルをutf 8 mb 4--UTF-8 Unicodeに変更すればいいです.この方法は簡単ですが、データベースを再起動する必要がある場合があります.もう一つの問題は、この方法があまり機能しないことがあるということです.第二に、データベースが保存できない以上、これらの表情をフィルタリングします.このような状況は、お客様の個性を損なってサービスをより便利にする方法です.現在、多くのサイトがこのように処理されています.結局、効率が肝心です.あなたのこの表情は保存されていても、どこで再び使うか分からないので、展示できません.だからやはりemoji文字をフィルタしましょう.
フィルタツール類単純DEMO
参考資料:
1. http://www.itmayun.com/it/files/226631678709806/article/406117164733730/1.html
サードパーティがログインすると、微信ニックネームと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