簡単な説明:
これらは内部ではと呼ばれ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
16進数では、これらのバイトは次のとおりです。
FE52E
ご覧のように、FE
おそらくgoomoji
アイコンを他のUTF-8文字と区別するためのプレフィックスを除いて52E
、アイコンのURL と一致します。一部のテストでは、これが他のアイコンにも当てはまることが証明されています。
大変な作業のようですが、コンバータはありますか?:
もちろんこれはスクリプト化できます。テスト用に次のPythonコードを作成しました。これらの関数は、base64でエンコードされた文字列を、URLにある短い16進文字列との間で変換できます。このコードは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インスペクターを使用するだけです。