首頁 > 後端開發 > Python教學 > 探索表情符號編碼

探索表情符號編碼

Barbara Streisand
發布: 2025-01-23 04:12:13
原創
786 人瀏覽過

深入探討Emoji編碼:Unicode到UTF-8位元組

您是否嘗試過將包含Emoji表情的字串轉換為位元組?

<code class="language-python">text = 'Hi ??‍♂️'

print(bytes(text, 'utf-8'))</code>
登入後複製

輸出結果:

<code>b'Hi \xf0\x9f\x99\x8b\xf0\x9f\x8f\xbd\xe2\x80\x8d\xe2\x99\x82\xef\xb8\x8f'</code>
登入後複製

您是否好奇那些x是什麼,以及它們如何轉換回Emoji表情?

深入研究後,您會發現單一Emoji表情需要五個Unicode字元來表示。

<code class="language-python">emoji = '??‍♂️'
print("Length: ", len(emoji))
for c in emoji:
    code = ord(c)
    print("{}\t{}\t{}".format(code, hex(code), c))</code>
登入後複製

輸出結果:

<code>Length:  5
128587  0x1f64b ?
127997  0x1f3fd ?
8205    0x200d  ‍
9794    0x2642  ♂
65039   0xfe0f  ️</code>
登入後複製

首先,我們有基礎Emoji:舉手的人? (128587 或十六進制的 0x1f64b),通常表示為 U 1F64B。

然後是膚色修飾符:淺膚色 (127997)。

將這兩個組合起來,您將得到一個具有這種膚色的中性性別舉手的人。

<code class="language-python">print(chr(128587) + chr(127997))</code>
登入後複製

輸出結果:

<code>??</code>
登入後複製

倒數第二個字元代表男性符號,最後一個字元稱為變體選擇器-16 (VS16),它指示前一個字元應顯示為Emoji表情,而不是符號。

許多字元可以顯示為符號或Emoji表情。

<code class="language-python">heart_symbol= '♥'
print(heart_symbol)
print(heart_symbol + chr(65039))</code>
登入後複製

輸出結果:

<code>♥
♥️</code>
登入後複製

注意:如果系統或渲染器不支援該Emoji表情,它可能會渲染為符號。在這種情況下,複製輸出並將其貼上到不同的文字編輯器或瀏覽器中以查看差異。

因此,前兩個和後兩個字元分別代表兩個單獨的Emoji表情。中間字元稱為零寬度連接符號 (ZWJ),用於組合兩個或多個Emoji表情。

<code class="language-python">woman = '?'
laptop = '?'
print(woman + chr(8205) + laptop)</code>
登入後複製

輸出結果:

<code>?‍?</code>
登入後複製
登入後複製

當然,系統或字體必須支援這些組合,否則它將只渲染為單獨的字元。

<code class="language-python">man = '?'
toilet = '?'

print(man + chr(8205) + toilet)</code>
登入後複製

輸出結果:

<code>?‍?</code>
登入後複製
登入後複製

現在讓我們看看一般情況下每個Unicode字元如何以UTF-8編碼表示為位元組。

讓我們考慮字元 U 1F64B。

首先,我們必須根據字元的範圍確定需要多少位元組來儲存它。我們可以只用三個位元組來儲存這個數字本身,但是這樣就沒有辦法將它解碼回單一字元。因此,使用以下模式: (為什麼要使用這個模式?)

11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

現在讓我們將數字 0x1f64b 的位元放入此模式。首先將其轉換為二進制。

<code class="language-python">print(bin(0x1F64B))</code>
登入後複製

輸出結果:

<code>0b11111011001001011</code>
登入後複製

該模式有21位,因此讓我們在開頭添加0以匹配:

000011111011001001011
000 011111 011001 001011

放入模式:11110000 10011111 10011001 10001011

現在,這些位元組的十六進位是什麼?

<code class="language-python">print(list(map(hex, [0b11110000, 0b10011111, 0b10011001, 0b10001011])))</code>
登入後複製

輸出結果:

<code>['0xf0', '0x9f', '0x99', '0x8b']</code>
登入後複製

請注意,這些與我們想要理解的前四個x匹配。現在您知道它們的意思了。

相關筆記:https://www.php.cn/link/0da44af358e8fcb6a6c2040602172d8d

Exploring emoji encodings

以上是探索表情符號編碼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板