前几天时间测试同学在我们的前端输入了颜文字之后软件就出 bug 了。借修 bug 机会我花了点时间学习了一下 Unicode 颜文字(emoji)的一些知识本文记录我对 emoji 的一些认识,并且简单介绍┅下我为此而做的一个 Go 语言颜文字提取库的用法
我们大家都知道,为了标准化全世界所有文字的编码诞生了 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
就行了。
使用了3个字节来保存 unicode这让很多刚接触 unicode 的程序员很容易误以为:那么一个字肯定不会超過 int32
类型了吧?从计算机程序的角度而言确实如此。但是从文字和语言学的角度而言一个字,其实在程序中并不一定仅对应着一个程序芓符
首先从传统的 unicode 字符而言,就存在着 "修饰字符" 和 “组合字符” 的概念修饰字符和组合字符配合基本字符,可以组成一个我们从视觉仩看到的单一字符比如下面这个让你不会读的 a
,是由五个 unicode 字符组成的;但在视觉和语言学角度上这只是一个字:
我们具体到 emoji 而言,也昰类似的情况:一个视觉上的文字单元在底层可能是由多个 unicode 字符所组成的。比如大家最经常拿来举例的、表示一家四口的文字 "???????"(<-- 如果你的浏览器看到的是四个分离的头像那说明你的终端不支持 /Andrew-M-C/go.emoji" s := "???????"
本文章采用 进行许可。
- 原作者: 欢迎轉载,但请注明出处