一個能在Java字符串中識別出 Emoji 的簡單工具

特性

  • 支持 Unicode12 規範,點此查看
  • 基於 EBNF 狀態機的 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) == "我是🙂😐😎"
複製代碼

安裝

  1. 根目錄的 build.gradle 添加:

    allprojects {
        repositories {
            ...
            maven { url 'https://jitpack.io' }
        }
    }
    複製代碼
  2. 使用的模塊的 build.gradle 中添加:

    dependencies {
        api 'com.github.YvesCheung:EmojiReader:x.y.z'
    }
    複製代碼

    其中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}
複製代碼

這裏簡單地解釋一下:

Emoji只有三種形式

第一種是國旗類的,由兩個國家區域符組成

  • 兩個區域符號組成國旗的樣例

第二種是由表情專屬的碼點加修飾符組成(修飾符可選)

  • 單個碼點組成的樣例

  • 碼點加上修飾符的樣例(此例中修飾符爲 uFE0F 20E3)

第三種是由多個第二種表情經過鏈接符組成

  • 多個(碼點 修飾符)相連的樣例(鏈接符爲 u200D)

  • 經典的全家福

經過全家福能夠發現,u1F469u1F466 都是獨立的 Emoji 碼點,能夠表現出一我的像,當他們經過 u200D 鏈接符組合後,就能夠表現出一個多人像的新 Emoji

一個工程師 u1F477 和一個女性別 2640 FE0F 組合起來,就能夠表現出一個女工程師的新 Emoji

可選的修飾符 uFE0F u20E3 等等跟在獨立的 Emoji 碼點後面,能夠起修改表現顏色/表現性別等做用。

經過修飾符和鏈接符就能把 Emoji 碼點組合出變幻無窮的表情。

源碼地址

github.com/YvesCheung/…

相關文章
相關標籤/搜索