深入探討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
以上是探索表情符號編碼的詳細內容。更多資訊請關注PHP中文網其他相關文章!