คำอธิบายสั้น:
ซึ่งเรียกกันภายในว่า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
บิตเหล่านี้สอดคล้องกับอักขระเข้ารหัส UTF-8 ขนาด 4 ไบต์
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 ของเบราว์เซอร์