客户端提交带有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