JAVA字符串识别_一个能在Java字符串中识别出 Emoji 的简单工具

本文介绍了一个Java工具,用于在字符串中识别和处理Emoji,支持Unicode12规范。它基于EBNF状态机,能准确判断字符串长度和切割,避免因Emoji导致的长度误判和乱码问题。提供了EmojiReader类,包含getTextLength和subSequence方法,确保按Emoji长度为1进行文本操作。同时,文章讲解了Emoji的Unicode语法和组合方式。
摘要由CSDN通过智能技术生成

特性

支持 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

b24818ef423121ceeeec2488d93c9e4c.png

不少业务都须要有字数的判断,好比用户昵称不能过长,发言内容有字数限制等等。若是不对 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'

}

复制代码

其中x.y.z 版本替换为

1

原理

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只有三种形式

第一种是国旗类的,由两个国家区域符组成

两个区域符号组成国旗的样例

b58af89e720add6502331392459981e8.png

第二种是由表情专属的码点加修饰符组成(修饰符可选)

单个码点组成的样例

efe4dcdd3b6ef0714a8e6b1a1b1a26a3.png

码点加上修饰符的样例(此例中修饰符为 uFE0F 20E3)

c89bcef1236bc9e697d94c436cf1ec40.png

第三种是由多个第二种表情经过链接符组成

多个(码点 修饰符)相连的样例(链接符为 u200D)

e5b9896af1ddb139d338f4840c2f02b2.png

经典的全家福

88cf7baa823c146b129be152d40918e3.png

经过全家福能够发现,u1F469 和 u1F466 都是独立的 Emoji 码点,能够表现出一我的像,当他们经过 u200D 链接符组合后,就能够表现出一个多人像的新 Emoji 。

一个工程师 u1F477 和一个女性别 2640 FE0F 组合起来,就能够表现出一个女工程师的新 Emoji 。

可选的修饰符 uFE0F u20E3 等等跟在独立的 Emoji 码点后面,能够起修改表现颜色/表现性别等做用。

经过修饰符和链接符就能把 Emoji 码点组合出变幻无穷的表情。

源码地址

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值