Emoji
判斷,比正則表達式更易維護Emoji
的字符串長度Emoji
Emoji | String.length | EmojiReader.getTextLength |
---|---|---|
♀ | 1 | 1 |
🙂 | 2 | 1 |
👱♂ | 5 | 1 |
🏳️🌈 | 6 | 1 |
👨👩👦👦 | 11 | 1 |
在Java的字符串中,一個 Emoji
由一個或多個 Unicode 碼點(CodePoint)組成,一個碼點可能由多個字符組成(取決於碼點是否大於 0x010000),所以一個 Emoji
可能由數個字符組成。git
不少業務都須要有字數的判斷,好比用戶暱稱不能過長,發言內容有字數限制等等。若是不對 Emoji
進行特殊處理,每每會出現不符合用戶預期的狀況。github
使用 EmojiReader.getTextLength
能夠獲取到文本的可視符號的長度,一個 Emoji
的長度爲1。正則表達式
String strWithEmoji = 「我是一個😃」;
int error = strWithEmoji.length(); //6
int correct = EmojiReader.getTextLength(strWithEmoji); //5
複製代碼
當顯示文本過長時,一般咱們會省略末尾的文本,並加上省略號。api
但若是字符串中含有 Emoji
,切割字符串就極可能把 Emoji
切段,變成亂碼。好比下面這個字符串:bash
"我是🙂😐😎💏"maven
通過 String.subString(0, 5) 處理後:gradle
"我是🙂?"ui
由於多個 Unicode 碼點共同組合才能完成一個 Emoji
的展現,經過切割後剩下的 Unicode 碼點會表現出沒法正常顯示的亂碼。url
使用 EmojiReader.subSequence
能夠按照一個 Emoji
長度爲1來進行符合視覺預期的裁剪。spa
EmojiReader.subSequence("我是🙂😐😎💏", 0, 5) == "我是🙂😐😎"
複製代碼
根目錄的 build.gradle 添加:
allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}
複製代碼
使用的模塊的 build.gradle 中添加:
dependencies {
api 'com.github.YvesCheung:EmojiReader:x.y.z'
}
複製代碼
Unicode 規範文檔中給出了 Emoji
的語法,是一個EBNF範式的表達:
possible_emoji :=
flag_sequence
| zwj_element (x{200D} zwj_element)+
flag_sequence :=
p{RI} p{RI}
zwj_element :=
p{Emoji} emoji_modification?
emoji_modification :=
p{EMod}
| x{FE0F} x{20E3}?
| tag_modifier
tag_modifier :=
[x{E0020}-x{E007E}]+ x{E007F}
複製代碼
這裏簡單地解釋一下:
經過全家福能夠發現,u1F469 和 u1F466 都是獨立的 Emoji
碼點,能夠表現出一我的像,當他們經過 u200D 鏈接符組合後,就能夠表現出一個多人像的新 Emoji
。
一個工程師 u1F477 和一個女性別 2640 FE0F 組合起來,就能夠表現出一個女工程師的新 Emoji
。
可選的修飾符 uFE0F u20E3 等等跟在獨立的 Emoji
碼點後面,能夠起修改表現顏色/表現性別等做用。
經過修飾符和鏈接符就能把 Emoji
碼點組合出變幻無窮的表情。