客戶端提交帶有emoji表情字符串一般會有如下處理
注: 文中的所有表和編碼不對應,原因:在eclipse中編輯的表情在該處不能正常顯示,所有就隨便用了個當前編輯器的表情
(表情字符串 是 客戶端提交到server 的數據使用String 變量接收的值 一般utf8編碼 )
1、判斷字符串是否是表情
2、獲取字符串的所有表情字符串 或 所有非表情字符串
3、將表情字符串轉成 HtmlDecimal 如: -> ;#128516;
4、將表情字符串轉成 Hexadecimal 如 : -> ;#x1f466;
5、將表情字符串轉成Unicode
6、 (3,4,5)的翻轉
7、表情語義分析
解決思路:
1、需要有一張 emoji 表情 、htmlDecimal 、 hexadecimal 、 語義映射表
2、有了數據表,剩下的就是API的處理了 , O(∩_∩)O哈哈~
正好在github 有該jar包和數據
<dependency>
<groupId>com.vdurmont</groupId>
<artifactId>emoji-java</artifactId>
<version>3.1.3</version>
</dependency>
該jar包中有個emojis.json的文件就是上面提到的映射表 結構如下:
{
"emoji": "",
"description": "smiling face with open mouth and smiling eyes",
"aliases": [
"smile"
],
"tags": [
"happy",
"joy",
"pleased"
]
}, ............
可以看到 json 數據中有 語義和標籤 ,HtmlDecimal 和 Hexadecimal 經過EmojiLoader : :loadEmojis 解析之後就有了(jar包中總共之後6個Java文件)
問題1、 3 、 4 、6 EmojiParser , EmojiManager 能找到對應的函數
大家可以看源碼 或者 https://github.com/vdurmont/emoji-java
問題5如下
public static String getUnicode(String source){
String returnUniCode=null;
String uniCodeTemp=null;
for(int i=0;i<source.length();i++){
uniCodeTemp = "\\u"+Integer.toHexString((int)source.charAt(i));
returnUniCode=returnUniCode==null?uniCodeTemp:returnUniCode+uniCodeTemp;
}
return returnUniCode;
}
問題2是自己當時在 EmojiParser 中擴展的 兩個函數 如下:
/**
* 獲取非表情字符串
* @param input
* @return
*/
public static String getNonEmojiString(String input) {
int prev = 0;
StringBuilder sb = new StringBuilder();
List<UnicodeCandidate> replacements = getUnicodeCandidates(input);
for (UnicodeCandidate candidate : replacements) {
sb.append(input.substring(prev, candidate.getEmojiStartIndex()));
prev = candidate.getFitzpatrickEndIndex();
}
return sb.append(input.substring(prev)).toString();
}
/**
* 獲取表情字符串
* @param input
* @return
*/
public static String getEmojiUnicodeString(String input){
EmojiTransformer transformer = new EmojiTransformer() {
public String transform(UnicodeCandidate unicodeCandidate) {
return unicodeCandidate.getEmoji().getHtmlHexadecimal();
}
};
StringBuilder sb = new StringBuilder();
List<UnicodeCandidate> replacements = getUnicodeCandidates(input);
for (UnicodeCandidate candidate : replacements) {
sb.append(transformer.transform(candidate));
}
return parseToUnicode(sb.toString());
}
運行測試如下:
String str = "aaaa