关于emoji,Go语言可以这么操作

Posted Go语言中文网

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于emoji,Go语言可以这么操作相关的知识,希望对你有一定的参考价值。

点击上方蓝色“ Go语言中文网 ”关注, 每天一起学 Go

什么是emoji

emoji就是一些意形符号。

emoji的实现

首先,你必须能够区分unicodeutf8字符之间的区别:

  • unicode,字符集,就是一个表格,记录这字符和码点(通常表示为 U+0031)之间的关系
  • utf8,是unicode的编码方案之一(还有utf16、utf32等)
  • 字符,是人类可以阅读的符号。emoji就是一批比较特殊的符号(可以理解为图片或者像素点集合)

因为是一种实现,所以不同平台实现的各不一样。以ok表情为例,各平台的实现如下:

image-20210302223155359

emoji分类

参考:https://www.unicode.org/Public/emoji/13.1/emoji-sequences.txt

Basic_Emoji

基本emoji,包含两种类型

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

详情:https://www.unicode.org/Public/emoji/5.0/emoji-variation-sequences.txt

Emoji_Keycap_Sequence

键帽序列,都是0-9、#、*开头,然后后面紧跟着U+FE0FU+20E3两个字符组合而成。

字符长度:均是3字符

键帽序列:https://www.notion.so/80b0da16e0304d7ea7653e7f3fff47c8

需要注意的是苹果输入法打出的键帽序列是反的,即U+20E3在前U+FE0F在后面

func TestEmoji(t *testing.T)  {
 s := "1⃣️"
 fmt.Printf("字节数:%d, 字符数:%d\n"len(s), len([]rune(s)))
 hexDump(s)
}

func hexDump(s string)  {
 fmt.Printf("字符串:%s\n======================\n", s)
 for index, item := range []rune(s) {
  hex := strconv.FormatInt(int64(item), 16)
  fmt.Printf("序号%d:Unicode 码点:U+%s,字节数:%d\n", index, hex, utf8.RuneLen(item))
 }
}

// 字节数:7, 字符数:3
// 字符串:1⃣️
// ======================
// 序号0:Unicode 码点:U+31,字节数:1
// 序号1:Unicode 码点:U+20e3,字节数:3
// 序号2:Unicode 码点:U+fe0f,字节数:3

RGI_Emoji_Flag_Sequence

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

国家或地区缩写字母编码表:https://www.notion.so/ea3653771b2f42a98c7a6d23a44aa94f

如上表所示,U+1F1E6 ~ U+1F1FF,分表代表A ~ Z共计26个字符。

  • 比如中国缩写是 CN,所以对应的旗帜编码就是 U+1F1E8(C) U+1F1F3(N)
  • 比如美国缩写是 US,所以对应的旗帜编码就是 U+1F1FA(U) U+1F1F8(S)

RGI_Emoji_Tag_Sequence

这里有三个比较特殊的地区,分别是:英格兰苏格兰威尔士

英格兰(

以上是关于关于emoji,Go语言可以这么操作的主要内容,如果未能解决你的问题,请参考以下文章

go语言-关于文件的操作和解释

[Go] 通过 17 个简短代码片段,切底弄懂 channel 基础

GO语言环境变量

使用GO语言灵活批量ssh登录服务器执行操作

Go 统计含 emoji 字符串字符数

Go 统计含 emoji 字符串字符数