Pequena descrição:
Eles são chamados internamente de goomoji
e parecem ser uma extensão UTF-8 não padrão. Quando o Gmail encontra um desses caracteres, ele é substituído pelo ícone correspondente. Não consegui encontrar nenhuma documentação sobre eles, mas consegui fazer a engenharia reversa do formato.
O que são esses ícones?
Esses ícones são na verdade os ícones que aparecem no painel "Inserir emoticons".
Embora eu não veja o 52E
ícone na lista, existem vários outros que seguem a mesma convenção.
Observe que também existem alguns ícones cujos nomes são prefixados, como . Não fui capaz de determinar se ou como esses ícones podem ser usados dessa maneira.gtalk.03C
O que é essa coisa de URI de dados?
Na verdade, não é um URI de dados , embora compartilhe algumas semelhanças. Na verdade, é uma sintaxe especial para codificação de caracteres não ASCII em assuntos de e-mail, definidos no RFC 2047 . Basicamente, funciona assim.
=?charset?encoding?data?=
Portanto, em nossa string de exemplo, temos os seguintes dados.
=?UTF-8?B?876Urg==?=
charset
= UTF-8
encoding
= B
(significa base64)
data
= 876Urg==
Então, como isso funciona?
Sabemos que de alguma forma, 876Urg==
significa o ícone 52E
, mas como?
Se decodificarmos em base64 876Urg==
, obtemos 0xf3be94ae
. Isso se parece com o seguinte em binário:
11110011 10111110 10010100 10101110
Esses bits são consistentes com um caractere codificado em UTF-8 de 4 bytes.
11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
Portanto, os bits relevantes são os seguintes:
011 111110 010100 101110
Ou quando alinhado:
00001111 11100101 00101110
Em hexadecimal, esses bytes são os seguintes:
FE52E
Como você pode ver, exceto pelo FE
prefixo que presumivelmente distingue os goomoji
ícones de outros caracteres UTF-8, ele corresponde ao 52E
no URL do ícone. Alguns testes comprovam que isso é verdadeiro para outros ícones.
Parece muito trabalhoso. Existe um conversor ?:
É claro que isso pode ser programado. Criei o seguinte código Python para meus testes. Essas funções podem converter a string codificada em base64 de e para a string hexadecimal curta encontrada na URL. Observe que este código foi escrito para Python 3 e não é compatível com Python 2.
Funções de conversão:
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')
Exemplos:
print(goomoji_decode('876Urg=='))
print(goomoji_encode('52E'))
Resultado:
52E
876Urg==
E, é claro, encontrar o URL de um ícone simplesmente requer a criação de um novo rascunho no Gmail, inserindo o ícone que você deseja e usando o inspetor DOM do seu navegador.