java emoji问号,emoji-java 用来表情转换,你会用了吗?
前言
今天項目中遇到一個需求,APP的問題上報和意見反饋提意見的時候,需要支持表情。前端沒什么,但是如果存入到mysql 就會報錯了。導致的原因是,Emoji表情占用4個字節,但是MySQL數據庫UTF-8編碼最多只能存儲3個字節。所以存儲就會報錯。
想要解決上面的問題,可以修改mysql 的編碼格式,這里就不建議了,大部分的還是3個字節的utf-8的編碼。如果直接改成4個字節的編號,會造成資源浪費。
第二種方法,可以不用mysql 數據庫存儲,比如我們存儲問題上報或者意見反饋,我們不一定需要使用關系型數據庫。我們項目中如果使用了其他的數據庫,我們可以使用其他類型的數據。比如我們直接將這類的信息存儲在redis 中就是一個不錯的選擇。
第三種方法,當然就是我們這里想講的,如果你不想改mysql 的編碼格式,也沒有其他的數據庫,那么就只好通過后端來進行轉換了。
依賴
有專門的jar 包幫我們做好了轉換,我們只需要傳入包含表情的字符串就會返回轉換后的字符串存在數據庫中,取出的時候,再進行轉換回來就好了。
com.vdurmont
emoji-java
4.0.0
github地址:https://github.com/vdurmont/emoji-java
簡單使用
我們使用也很簡單,就兩個方法,看下面這個例子:
publicstaticvoidmain(String[] args) {
String str="\uD83E\uDD17\uD83D\uDE0F\uD83D\uDE36\uD83D\uDE10\uD83D\uDE44";
String result= EmojiParser.parseToAliases(str);
System.out.println(result);
String res=EmojiParser.parseToUnicode(result);
System.out.println(res);
}
打印的結果如下:
:hugging::smirk::no_mouth::neutral_face::eye_roll:
🤗😏😶😐🙄
可以看到,EmojiParser.parseToAliases(str)是將包含字符串的str進行轉義。EmojiParser.parseToUnicode(str);是將轉義后的str 進行還原成表情。有點像對數據進行加密解密的味道。
一探究竟
使用起來不難,但既然是github 上開源的項目,我們也來稍微的深入了解下。可以看到整個jar包還是很簡單的,就幾個類而已。我們用到的EmojiParser 類,所以我們就來看看這類方法。
這個類的最上面的一個方法就我們用的最多的將包含有表情的字符串進行轉義??梢钥吹竭@里用了多態性質,還有一個同命不同參的方法。其實就是給第二個參數賦予了一個默認值。
可以看到有三種模式。
publicstaticStringparseToAliases(String input, final EmojiParser.FitzpatrickAction fitzpatrickAction) {
EmojiParser.EmojiTransformer emojiTransformer = new EmojiParser.EmojiTransformer() {
publicStringtransform(EmojiParser.UnicodeCandidate unicodeCandidate) {
switch(fitzpatrickAction) {
case PARSE:
default:
if (unicodeCandidate.hasFitzpatrick()) {
return ":" + (String)unicodeCandidate.getEmoji().getAliases().get(0) + "|" + unicodeCandidate.getFitzpatrickType() + ":";
}
case REMOVE:
return ":" + (String)unicodeCandidate.getEmoji().getAliases().get(0) + ":";
case IGNORE:
return ":" + (String)unicodeCandidate.getEmoji().getAliases().get(0) + ":" + unicodeCandidate.getFitzpatrickUnicode();
}
}
};
return parseFromUnicode(input, emojiTransformer);
}
默認情況下,別名將解析并包括將提供的任何Fitzpatrick修飾符。如果要刪除或忽略Fitzpatrick修飾符。
parseFromUnicode(input, emojiTransformer) 方法就是將表情轉換成對應的字符串了。至于怎么轉換的,是將字符串拆成一個個的字符,然后在emojis.json 中匹配,如果emojis.json 有這個表情,就會轉義成對應的別名。
問題
所以我們不能保證所有的表情在emojis.json 中都存在,也就是說,這個轉換的jar 包只能支持部分表情。比如這個表情就沒有。
🤭
String str="\uD83E\uDD2D";
所以如果我們輸入了一些無法轉換的表情,入庫的時候還是會報錯。那沒有的表情怎么處理呢?這里提供兩種思路。一:將不能轉換的表情舍棄掉,雖然這個表情在json中沒有,但是它依舊是一個四字節的字符。所以我們可以寫一個通用方法過濾掉。沒能轉換的表情依然是下面\ud 開頭的,所以用replaceAll 直接替換掉。slipStr是將我們不能轉換的表情替換成我們自定義的字符。
public static String filterEmoji(String source,String slipStr) {
if(StringUtils.isNotBlank(source)){
return source.replaceAll("[\\ud800\\udc00-\\udbff\\udfff\\ud800-\\udfff]", slipStr);
}else{
return source;
}
}
上面就是將不能轉義的表情直接移除掉,也可以使用一個我們自定義的默認表情。但是上面雖然是可行之法,卻對用戶不是很友好,用戶輸入的表情,再返回給用戶的時候,竟然有些表情沒有了。但是畢竟表情起到的修飾作用更多的,沒有的話也情有可原。
方法二,既然前面說了,表情都是在emojis.json 中匹配的,那如果沒有的話,我們在emojis.json 加上對應的關系,是不是就可以了呢?我們來試試。我們用壓縮包打開jar包
編輯emojis.json 比如我們🤭 這個表情沒有,那我們自己添加一個。
{
"emojiChar": "🤭",
"emoji": "\uD83E\uDD2D",
"description": "quellanan abc",
"aliases": [
"quellanan"
],
"tags": []
}
別名我們隨意起沒有關系,只要確保唯一就可以,這樣在解密的時候可以轉成對應的表情。然后我們保存修改好的jar,重新導入項目中。在idea 中發現我們自定義的這個表情不顯示。說明idea 是不支持這個表情的。
我們再來看看代碼是否能正常轉換。
可以看到,將表情轉成我們自定義的別名是沒有問題的。但是將它還原成表情,卻顯示不出來,這里我確信應該是可以還原成功的,只是idea不支持這個表情,所以顯示不出來。
總結
我們在實際開發過程中,還是可能需要存儲表情的,特別是APP,手機上大家輸入表情很常見,所以我們在存儲的時候,可以將表情轉義一下,然后顯示的時候再轉義回來。
總結
以上是生活随笔為你收集整理的java emoji问号,emoji-java 用来表情转换,你会用了吗?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python 中的range,以及num
- 下一篇: javascript时间戳和日期字符串相