Go 统计含 emoji 字符串字符数

1.背景

项目种需要统计用户昵称的字符数量进行限制,用户可以输入英文,中文,emoji 字符,当用户输入中英文和普通的 emoji 字符时,将字符串转为 []rune 进行统计没有问题。

func main() {s0 := "我爱中国"               // 中文s1 := "我爱China"              // 中英文s2 := "我爱China😀"             // 中英文加普通 emoji(笑脸)fmt.Println(len([]rune(s0))) // 4// 或 fmt.Println(utf8.RuneCountInString(s0))fmt.Println(len([]rune(s1))) // 7// 或 fmt.Println(utf8.RuneCountInString(s1))fmt.Println(len([]rune(s2))) // 8// fmt.Println(utf8.RuneCountInString(s2))
}

但是,当字符串种含有旗帜类的 emoji 字符,比如下面的中国旗帜,使用 []rune 无法准确统计字符数量。

在这里插入图片描述

func main() {s := "我爱中国🇨🇳"fmt.Println(len([]rune(s))) // 6
}

预期输出 5,结果输出了 6。

因为代码编辑器不支持旗帜 emoji,所以显示为 CN。

2.emoji 分类

你可能以为一个 emoji 字符仅用一个 Unicode 码值表示,虽然大部分 emoji 是这样的,但实际上并非如此。

上面统计包含旗帜 emoji 字符串时,错误地将一个 emoji 字符统计成了两个字符,原因也是如此。

emoji 实际上有多种分类:

Basic_Emoji
Emoji_Keycap_Sequence
RGI_Emoji_Flag_Sequence
RGI_Emoji_Tag_Sequence
RGI_Emoji_Modifier_Sequence
RGI_Emoji_ZWJ_Sequence

2.1 Basic_Emoji

基本 emoji,对应 Emoji Sequences 标准书 Basic_Emoji 小节。

包含两种类型:

  • 单一 unicode 字符
  • 单一 unicode 字符后面增加 U+FE0E 或 U+FE0F 分别表示以黑白文本模式还是彩色模式展示表情

2.2 Emoji_Keycap_Sequence

键帽序列,对应 Emoji Sequences 标准书 Emoji_Keycap_Sequence 小节。

这一类序列总共有12组,这里其实就对应着电话上的12个按钮,分别是 0~9 十个字符,外加 # 和 * 开头,然后后面紧跟着 U+FE0F 和 U+20E3 两个字符组成。

字符长度:均是 Unicode 码值。

2.3 RGI_Emoji_Flag_Sequence

国家/地区旗帜序列。对应 Emoji Sequences 标准书 RGI_Emoji_Flag_Sequence 小节。

其中 RGI(Recommended for General Interchange)表示可以在日常的交流中使用。

这一组文字均由两个 unicode 字符组成,字符的值为 U+1F1E6 到 U+1F1FF 的26个字符,一一对应着 A 到 Z。这一组 unicode 文字对应着使用两个字母的国家/地区码所对应的国家/地区旗帜,以及用 UN 表示的联合国旗和 EU 表示的欧盟旗。

合法的旗帜总共有 258 个组合,标准中完整地列出了。需要注意的是,U+1F1E6 到 U+1F1FF 这26个字符不能单独出现,它们是专门用于这一类旗帜所使用的特殊 unicode 字符。

国家/地区码可参见 ISO 3166-1。

2.4 RGI_Emoji_Tag_Sequence

标记序列,对应 Emoji Sequences 标准书 RGI_Emoji_Tag_Sequence 小节。

这一组其实是 unicode 预留的扩展类别,虽然在 emoji 中定义了所谓 “tag latin letter” 用于此类别,但是目前只有三个合法 emoji,从展示效果上分别是 英格兰、苏格兰、威尔士旗帜。

英格兰(󠁧󠁢󠁥󠁮󠁧🏴󠁧󠁢󠁥󠁮󠁧󠁿):U+1F3F4 U+E0067 U+E0062 U+E0065 U+E006E U+E0067 U+E007F
苏格兰(🏴󠁧󠁢󠁳󠁣󠁴󠁿):U+1F3F4 U+E0067 U+E0062 U+E0073 U+E0063 U+E0074 U+E007F
威尔士(🏴󠁧󠁢󠁷󠁬󠁳󠁿):U+1F3F4 U+E0067 U+E0062 U+E0077 U+E006C U+E0073 U+E007F

2.5 RGI_Emoji_Modifier_Sequence

修饰符序列,对应 Emoji Sequences 标准书 RGI_Emoji_Modifier_Sequence 小节。

Unicode 定义了五个用于 emoji 的肤色字符,分别是:U+1F3FB U+1F3FC U+1F3FD U+1F3FE U+1F3FF,在 unicode 标准中分别表示:

light skin tone
medium-light skin tone
medium skin tone
medium-dark skin tone
dark skin tone

用于与部分基本 emoji 经字符搭配,用于调整相应文字中的肤色。常用在需要西方式 “政治正确” 的场合。

这五个字符按照标准而言是不会单独出现的,必然是跟在一个基本 emoji 后面。

Unicode 总共定义了 580 个 modifier sequences,也就是说有 116 个基本 emoji 字符可以搭配肤色字符使用。

2.6 RGI_Emoji_ZWJ_Sequence

零宽度连接符,对应 Emoji ZWJ Sequences 标准书。

ZWJ 即 Zero Width Joiner。ZWJ 的 unicode 码值为 U+200D,因为是没有宽度的连接符,所以不可见,它的作用就是连接两个字符,比如 “👨‍👩‍👧‍👦” 就是由 U+200D 连接四个 emoji 字符而成。
在这里插入图片描述
并不是所有的 emoji 都可以任意连接。Unicode 定义了 1122 个 Emoji ZWJ 序列类型的文字。在 Emoji ZWJ Sequences 标准书可以查阅完整列表。

3.正确统计字符串字符数量

几番搜索,终于发现开源包 uniseg 可以准确识别包含 emoji 字符的字符串的字符数量。它根据 Unicode Standard Annex #29中指定的规则来中断字符串。

使用示例:

package mainimport ("fmt""github.com/rivo/uniseg"
)func main() {s := "我爱中国🇨🇳"fmt.Println(uniseg.GraphemeClusterCount(s))
}

运行输出:

5

4.小结

不含 emoji 字符的字符串,可以使用标准库 utf8 包内的相关函数来统计字符串长度,比如 utf8.RuneCountInString(),或者将字符串转换为 []rune 在通过 len() 来获取长度。

因为 emoji 字符长度不固定,判断是否是 emoji 表情,不能简单按照 UTF8 编码规则来判断,而应该根据 Unicode 码值范围与连接顺序来判断是否为 emoji,可以使用开源库 uniseg 来准确获取包含 emoji 字符的字符串长度(字符数)。


参考文献

[1] EmojiXD
[2] go语言:彻底掌握emoji
[3] Unicode 颜文字(emoji)格式和 Go 代码处理
[4] emoji 标准书
[5] string - 计算golang字符串中的字符

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/34549.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PostgreSQL中统计指定字符或者单词或者字符串在一个长字符串中出现总次数,PostgreSQL统计字符串中某字符出现次数

PostgreSQL中统计指定字符或者单词或者字符串在一个长字符串中出现总次数,PostgreSQL统计字符串中某字符出现次数 pg自带函数的方式另外一种思路方式,字符替换,统计被替换的字符数函数 translate(string text, from text, to text) pg自带函数…

PostgreSQL 字符串函数汇总

文章目录 前言拼接字符串填充字符串大小写转换获取字符串长度截取字符串裁剪字符串获取第一个字符的ASCII码计算string的MD5散列判断是否包含字符串null 和 的区别与判断以及COALESCE函数nullif函数合并字符串将字符串合并成一个数组分割字符串 总结 前言 本文基于 PostgreSQ…

婚礼视频mv短片制作,3分钟快速教程!教你制作婚礼开场创意视频

制作一个婚礼视频或婚礼MV短片,当下非常流行。用生活照、婚纱照片做成视频,在婚礼上当作开场或者生活中留给婚礼一个纪念,都是不错的选择。而且用照片做成视频,方法简单,但是创意依旧满满。 今天就教大家3分钟快速学会制作婚礼视频,利用生活照或婚纱照,配上数码大师里的…

SpringBoot+Redis实现接口限流

1.redis接口限流注解 定义一个注解标明需要使用限流的接口 Target(ElementType.METHOD) Retention(RetentionPolicy.RUNTIME) Documented public interface AccessLimit {/*** return 单位时间(秒)*/int seconds();/*** return 单位时间最大请求次数*/…

访问url图片并上传oss图片显示不完整问题解决

问题:在之前通过链接上传图片的时候,都是先获取inputStream流,然后通过available()方法获取文件大小。但是通过这种方法获取到的文件大小是不准确的,因为这个时候文件还没有读取完全,所以获取到的文件大小是不完全的。…

乱序执行的原理——减轻数据灾难的影响

文/Hisa Ando 处理器基本上会按照程序中书写的机器指令的顺序执行。按照书写顺序执行称为按序执行(In-Order )。按照书写顺序执行时,如果从内存读取数据的加载指令、除法运算指令等延迟(等待结果的时间)较长的指令后面紧跟着使用该指令结果的指令,就会陷…

倍福 ton_b%C3%A9ton野蛮或野蛮

倍福 ton Brutalism style mainly has emphasis on materials, textures and construction, producing highly expressive forms. Popular in the 1960s and 1970s brutalism originated post–World War II when the design of low-cost housing and government buildings wer…

每周分享第 55 期

这里记录过去一周,我看到的值得分享的东西,每周五发布。 欢迎投稿,或推荐你自己的项目,请前往 GitHub 的 ruanyf/weekly 提交 issue。 (题图:昆山火车站,苏州,2018) 关于 996 工作制&#xff0c…

每周分享第 34 期

这里记录过去一周,我看到的值得分享的东西,每周五发布。 欢迎投稿,或推荐你自己的项目,请前往 GitHub 的 ruanyf/weekly 提交 issue。 英国有一家叫做 BioTeq 的创业公司,主营业务是人体芯片,也就是在人的体…

OpenStack 环境配置

OpenStack 环境配置 虚拟机资源信息 1、控制节点ct CPU:双核双线程-CPU虚拟化开启 内存:8G 硬盘:300G 双网卡:VM1-(局域网)192.168.100.20 NAT-192.168.80.20 操作系统:Centos 7.6&#xff0…

那一年,我们在巴塞罗那找到的「ONES 图腾」

临近2021年岁末,「圣诞之星」被悬挂到圣家族大教堂第二高塔「圣母塔」之上,这意味着大教堂进入了最后的施工阶段。 圣家族大教堂(简称「圣家堂」)被称为世界上最著名的「烂尾楼」——从1882年开始修建,至今依然没有建成…

天正网络版修改服务器地址,修改天正网络版服务器地址

修改天正网络版服务器地址 内容精选 换一换 修改子网名称、DNS服务器地址等。当前在部分区域中,子网已从虚拟私有云中解耦,解耦后子网拥有独立入口。未解耦:在虚拟私有云详情页的“子网”页签,可对子网进行操作。本小节的操作步骤指导以此入口为例。已解耦:在进入“网络 &…

vba 怎么取得一个book中最右边的sheet名_在阴影中一心前进 | 安藤忠雄:艰难的日子里坚韧地活...

李乐贤:在我20岁的时候,对未来和专业充满了憧憬但又迷茫;安藤忠雄的讲座和书陪伴我度过了非常艰难的一段日子。在我们很多次想要放弃的时候,他人生中的求学实践经历为所有的年轻建筑师带来了启发和坚韧。很多时候 ,我们…

计算机辅助设计还需要手绘吗,建筑设计师,还需要手绘吗?

原标题:建筑设计师,还需要手绘吗? 来源:城市建筑(ID:UA_2004) 本文已获授权 如今,你看到的建筑师的工作状态 大多是这样的 这样的 在未来还有可能是这样的 在这样一个科技越来越发达, 表现手法越…

科学-建筑学:建筑学百科

ylbtech-科学-建筑学:建筑学百科 建筑学,从广义上来说,是研究建筑及其环境的 学科。建筑学是一门横跨工程技术和人文艺术的学科。 建筑学所涉及的建筑艺术和建筑技术、以及作为实用艺术的建筑艺术所包括的美学的一面和实用的一面,…

黑建筑学计算机怎么样,听起来很高大上的建筑学专业,到底咋样

原标题:听起来很高大上的建筑学专业,到底咋样 专业简介 建筑学 专业介绍: 本专业培养适应我国社会主义经济发展和现代化建设需要,掌握建筑学科的基本理论、基本知识和基本设计方法,接受建筑师基本训练,具备…

谷歌打响全面反击战:AI重构搜索、新模型比肩GPT-4

作者:xxx, 图文编辑:xj 来源:公众号「xxx」 明敏 丰色 发自 凹非寺量子位 | 公众号 QbitAI 万众瞩目,谷歌的反击来了。 现在,谷歌搜索终于要加入AI对话功能了,排队通道已经开放。 当然这还只是第…

AutoGPT、AgentGPT、BabyAGI、HuggingGPT、CAMEL:各种基于GPT-4自治系统总结

ChatGPT和LLM技术的出现使得这些最先进的语言模型席卷了世界,不仅是AI的开发人员,爱好者和一些组织也在研究探索集成和构建这些模型的创新方法。各种平台如雨后春笋般涌现,集成并促进新应用程序的开发。 AutoGPT的火爆让我们看到越来越多的自…

恐怖的GPT4!我All In了!!

"GPT4 太恐怖了,我要All In了" "作为一个程序员,我能接受被淘汰,但是我要亲眼见证下我是怎么被淘汰的" 不止一次听到不同的人和我说类似的话了。 最近几天,chatGPT实在是太火了,火得一塌糊涂&…

chatgpt赋能python:Python新手如何兼职学习SEO技能

Python新手如何兼职学习SEO技能 随着互联网的快速发展,SEO技能已经成为了许多企业必备的能力。而Python作为一种强大的编程语言,正在被越来越多的企业所青睐。本文将介绍Python新手如何兼职学习SEO技能。 什么是SEO? SEO即搜索引擎优化&am…