#简短说明:
它们在内部被称为goomoji,它们似乎是一个非标准的 UTF-8 扩展。当 Gmail 遇到这些字符之一时,它会被相应的图标替换。我无法找到关于它们的任何文档,但我能够对格式进行逆向工程。
#这些图标是什么?
这些图标实际上是出现在“插入表情”面板下的图标。
虽然我在列表中没有看到 52E 图标,但还有其他几个遵循相同约定的图标。
请注意,还有一些图标名称带有前缀,例如gtalk.03C。我无法确定这些图标是否或如何以这种方式使用。
#这个Data URI是什么东西?
它实际上不是Data URI,尽管它确实有一些相似之处。它实际上是一种在电子邮件主题中编码非 ASCII 字符的特殊语法,在RFC 2047 中定义。基本上,它是这样工作的。
=?charset?encoding?data?=
所以,在我们的示例字符串中,我们有以下数据。
=?UTF-8?B?876Urg==?=
-
charset = UTF-8
-
encoding = B(表示base64)
-
data = 876Urg==
#那么它是怎样工作的?
不知何故,我们知道876Urg== 表示图标52E,但如何?
如果我们对876Urg==进行base64解码,我们得到0xf3be94ae。这在二进制中如下所示:
11110011 10111110 10010100 10101110
这些位与 4 字节 UTF-8 编码字符一致。
11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
所以相关位如下:
011 111110 010100 101110
或者当对齐时:
00001111 11100101 00101110
在十六进制中,这些字节如下:
FE52E
如您所见,除了FE 前缀可能是为了将goomoji 图标与其他UTF-8 字符区分开来,它与图标URL 中的52E 匹配。一些测试证明这适用于其他图标。
#听起来工作量很大,有转换器吗?:
这当然可以编写脚本。我为我的测试创建了以下 Python 代码。这些函数可以将 base64 编码的字符串与 URL 中的短十六进制字符串进行转换。请注意,此代码是为 Python 3 编写的,与 Python 2 不兼容。
###转换函数:
import base64
def goomoji_decode(code):
#Base64 decode.
binary = base64.b64decode(code)
#UTF-8 decode.
decoded = binary.decode('utf8')
#Get the UTF-8 value.
value = ord(decoded)
#Hex encode, trim the 'FE' prefix, and uppercase.
return format(value, 'x')[2:].upper()
def goomoji_encode(code):
#Add the 'FE' prefix and decode.
value = int('FE' + code, 16)
#Convert to UTF-8 character.
encoded = chr(value)
#Encode UTF-8 to binary.
binary = bytearray(encoded, 'utf8')
#Base64 encode return end return a UTF-8 string.
return base64.b64encode(binary).decode('utf-8')
###示例:
print(goomoji_decode('876Urg=='))
print(goomoji_encode('52E'))
###输出:
52E
876Urg==
当然,查找图标的 URL 只需要在 Gmail 中创建一个新草稿,插入所需的图标,并使用浏览器的 DOM 检查器。