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