Breve descripción:
Se les conoce internamente como goomoji
, y parecen ser una extensión UTF-8 no estándar. Cuando Gmail encuentra uno de estos caracteres, se reemplaza por el icono correspondiente. No pude encontrar ninguna documentación sobre ellos, pero pude realizar ingeniería inversa en el formato.
¿Qué son estos iconos?
Esos iconos son en realidad los que aparecen debajo del panel "Insertar emoticonos".
Si bien no veo el 52E
ícono en la lista, hay varios otros que siguen la misma convención.
Tenga en cuenta que también hay algunos iconos cuyos nombres tienen prefijos, como . No pude determinar si estos íconos se pueden usar de esta manera ni cómo.gtalk.03C
¿Qué es esto de URI de datos?
En realidad, no es un URI de datos , aunque comparte algunas similitudes. En realidad, es una sintaxis especial para codificar caracteres no ASCII en asuntos de correo electrónico, definida en RFC 2047 . Basicamente funciona de esta manera.
=?charset?encoding?data?=
Entonces, en nuestra cadena de ejemplo, tenemos los siguientes datos.
=?UTF-8?B?876Urg==?=
charset
= UTF-8
encoding
= B
(significa base64)
data
= 876Urg==
¿Entonces, cómo funciona?
Sabemos que de alguna manera, 876Urg==
significa el ícono 52E
, pero ¿cómo?
Si decodificamos en base64 876Urg==
, obtenemos 0xf3be94ae
. Esto se parece a lo siguiente en binario:
11110011 10111110 10010100 10101110
Estos bits son consistentes con un carácter codificado en UTF-8 de 4 bytes.
11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
Entonces los bits relevantes son los siguientes:
011 111110 010100 101110
O cuando está alineado:
00001111 11100101 00101110
En hexadecimal, estos bytes son los siguientes:
FE52E
Como puede ver, a excepción del FE
prefijo que presumiblemente distingue los goomoji
íconos de otros caracteres UTF-8, coincide con el 52E
de la URL del ícono. Algunas pruebas demuestran que esto es válido para otros iconos.
Parece mucho trabajo, ¿hay un convertidor ?:
Esto, por supuesto, se puede programar. Creé el siguiente código Python para mis pruebas. Estas funciones pueden convertir la cadena codificada en base64 hacia y desde la cadena hexadecimal corta que se encuentra en la URL. Tenga en cuenta que este código está escrito para Python 3 y no es compatible con Python 2.
Funciones de conversión:
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')
Ejemplos:
print(goomoji_decode('876Urg=='))
print(goomoji_encode('52E'))
Salida:
52E
876Urg==
Y, por supuesto, encontrar la URL de un icono simplemente requiere crear un nuevo borrador en Gmail, insertar el icono que desea y usar el inspector DOM de su navegador.