简短的介绍:
在内部将它们称为goomoji
,并且它们似乎是非标准的UTF-8扩展名。当Gmail遇到这些字符之一时,将被相应的图标替换。我找不到关于它们的任何文档,但可以对格式进行反向工程。
这些图标是什么?
这些图标实际上是显示在“插入图释”面板下的图标。
虽然我没有52E
在列表中看到该图标,但还有其他几个遵循相同的约定。
请注意,还有一些带有名称前缀的图标,例如。我无法确定是否可以以这种方式使用这些图标。gtalk.03C
数据URI是什么?
尽管它确实有一些相似之处,但它实际上不是数据URI。实际上,这是在RFC 2047中定义的用于在电子邮件主题中编码非ASCII字符的特殊语法。基本上,它是这样的。
=?charset?encoding?data?=
因此,在示例字符串中,我们具有以下数据。
=?UTF-8?B?876Urg==?=
charset
= UTF-8
encoding
= B
(表示base64)
data
= 876Urg==
那么它是怎样工作的?
我们知道以某种方式876Urg==
表示图标52E
,但是如何?
如果我们对base64进行解码876Urg==
,则会得到0xf3be94ae
。看起来像下面的二进制文件:
11110011 10111110 10010100 10101110
这些位与4字节UTF-8编码字符一致。
11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
因此,相关的位如下:
011 111110 010100 101110
或对齐时:
00001111 11100101 00101110
这些字节以十六进制形式如下:
FE52E
如您所见,除了可以FE
将goomoji
图标与其他UTF-8字符区分开的前缀之外,它与52E
图标URL中的匹配。一些测试证明,这对于其他图标也适用。
听起来需要做很多工作,有转换器吗?:
这当然可以编写脚本。我为测试创建了以下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检查器。