1、问题描述
在输入框输入表情,表情到后台会被转为 \uD83D\uDE0A 这样的形式,最关键的是存入数据库会报错,导致后台直接500。
解决办法
将表情的代码,即\uD83D\uDE0A 转为类似html的符号存入数据库,去出来展示的时候在转换为\uD83D\uDE0A 展示。
过程
导包
<dependency>
<groupId>com.vdurmont</groupId>
<artifactId>emoji-java</artifactId>
<version>3.2.0</version>
</dependency>
版本可以修改。
代码
import com.vdurmont.emoji.EmojiParser;
import org.apache.commons.lang3.StringUtils;
import java.util.List;
/**
* Created by qqg on 2018/1/5.
*/
public class EmojiDealUtil extends 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());
}
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;
}
/**
* 将字符串转换为html数据存入数据库
* @param emoji 要转换的字符串,可以包含或不包括表情包
* @return
*/
public String changeEmojiToHtml(String emoji){
if(StringUtils.isNotBlank(EmojiDealUtil.getEmojiUnicodeString(emoji))){
String hexadecimal = EmojiParser.parseToHtmlHexadecimal(emoji);
System.out.println(hexadecimal);
/*String interactContent = EmojiParser.parseToUnicode(hexadecimal);
System.out.println(interactContent);*/
return hexadecimal;
}else {
return emoji;
}
}
/**
* 将表情包还原
* @param string
* @return
*/
public String changeStrToEmoji(String string){
return EmojiParser.parseToUnicode(string);
}
/*public static void main(String[] args) {
if(StringUtils.isNotBlank(EmojiDealUtil.getEmojiUnicodeString("topicContentto腐败picContent腐败\uD83D\uDE0A"))){
String hexadecimal = EmojiParser.parseToHtmlHexadecimal("topicContentto腐败picContent腐败\uD83D\uDE0A");
System.out.println(hexadecimal);
String interactContent = EmojiParser.parseToUnicode(hexadecimal);
System.out.println(interactContent);
}
}*/
}