Unicode 颜文字(emoji)格式和 Go 代码处理

2020-05-09 13:15:37 浏览数 (1)

前言

前几天时间测试同学在我们的前端输入了颜文字,之后软件就出 bug 了。借修 bug 机会我花了点时间学习了一下 Unicode 颜文字(emoji)。本文记录我对 emoji 的一些认识,并且简单介绍一下我为此而做的一个 Go 语言颜文字提取库的用法。还请各位读者不吝指教。


Unicode 背景简介

我们大家都知道,为了标准化全世界所有文字的编码,诞生了 unicode。最早 unicode 的设计者们采用的是一个字(2 bytes)来表示 unicode 值(UCS-2),以为总共 65536 个值就可以表示所有的字符了,也就是我们常见的 unicode 表示法 U 1234

然而汉字的博大精深(历史上的各种汉字实在是太多了)让 unicode 认识到了错误。很快,unicode 的编码空间就扩展到了21位(注意:略少于3个字节,但是实际上在内存中经常使用4字节存储,对应于 UCS-4)。在绝大部分的程序语言/软件中,使用等效的 uint32 类型就可以将 unicode 字符一一保存。

比如对应于 MySQL 的 utf8mb4 就是可以使用最大 4 个字节来保存 unicode 字符。我们的 bug 就是出在 DB 中,解决方法很简单,改成 utfmb4 就行了。


Emoji 编码格式简介

使用了3个字节来保存 unicode,这让很多刚接触 unicode 的程序员很容易误以为:那么一个字肯定不会超过 int32 类型了吧?从计算机程序的角度而言,确实如此。但是从文字和语言学的角度而言,一个,其实在程序中并不一定仅对应着一个程序字符

首先从传统的 unicode 字符而言,就存在着 "修饰字符" 和 “组合字符” 的概念,修饰字符和组合字符配合基本字符,可以组成一个我们从视觉上看到的单一字符。比如下面这个让你不会读的 a,是由五个 unicode 字符组成的;但在视觉和语言学角度上,这只是一个字:

我们具体到 emoji 而言,也是类似的情况:一个视觉上的文字单元,在底层可能是由多个 unicode 字符所组成的。比如大家最经常拿来举例的、表示一家四口的文字 "

0 人点赞