Краткое описание:
Они называются внутри как goomoji
, и они выглядят нестандартным расширением UTF-8. Когда Gmail встречает один из этих символов, он заменяется соответствующим значком. Мне не удалось найти по ним какую-либо документацию, но я смог реконструировать формат.
Что это за значки?
Эти значки на самом деле являются значками, которые появляются на панели «Вставить смайлы».
Хотя я не вижу 52E
значка в списке, есть несколько других, которые следуют тому же соглашению.
Обратите внимание, что есть также некоторые значки, имена которых имеют префиксы, например . Мне не удалось определить, можно ли использовать эти значки таким образом и как.gtalk.03C
Что это за URI данных?
На самом деле это не Data URI , хотя у него есть некоторые общие черты. На самом деле это специальный синтаксис для кодирования не-ASCII символов в темах электронной почты, определенный в RFC 2047 . В основном это работает так.
=?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 вашего браузера.