Meneroka pengekodan emoji

Barbara Streisand
Barbara Streisandasal
2025-01-23 04:12:13853semak imbas

Selam dalam pengekodan Emoji: daripada Unicode kepada UTF-8 bait

Adakah anda cuba menukar rentetan yang mengandungi Emoji kepada bait?

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

print(bytes(text, 'utf-8'))</code>

Hasil keluaran:

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

Adakah anda ingin tahu apakah x itu dan cara ia menukar kembali kepada Emoji?

Menggali lebih dalam, anda akan mendapati bahawa satu Emoji memerlukan lima aksara Unicode untuk diwakili.

<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>

Hasil keluaran:

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

Pertama, kami mempunyai emoji asas: Orang yang mengangkat tangan (128587 atau 0x1f64b dalam perenambelasan), biasanya diwakili sebagai U 1F64B.

Kemudian terdapat pengubah suai ton kulit: Nada Kulit Cerah (127997).

Gabungkan kedua-dua ini dan anda mendapat orang yang mengangkat tangan neutral jantina dengan tona kulit ini.

<code class="language-python">print(chr(128587) + chr(127997))</code>

Hasil keluaran:

<code>??</code>

Watak kedua terakhir mewakili simbol lelaki, dan watak terakhir dipanggil Pemilih Varian-16 (VS16), yang menunjukkan bahawa watak sebelumnya harus dipaparkan sebagai emoji, bukan simbol.

Banyak aksara boleh dipaparkan sebagai simbol atau emoji.

<code class="language-python">heart_symbol= '♥'
print(heart_symbol)
print(heart_symbol + chr(65039))</code>

Hasil keluaran:

<code>♥
♥️</code>

Nota: Jika sistem atau pemapar tidak menyokong emoji, ia mungkin dipaparkan sebagai simbol. Dalam kes ini, salin output dan tampalkannya ke dalam editor teks atau penyemak imbas yang berbeza untuk melihat perbezaannya.

Oleh itu, dua aksara pertama dan dua aksara terakhir mewakili dua ekspresi Emoji yang berasingan. Watak tengah dipanggil penyambung lebar sifar (ZWJ) dan digunakan untuk menggabungkan dua atau lebih emoji.

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

Hasil keluaran:

<code>?‍?</code>

Sudah tentu, sistem atau fon mesti menyokong gabungan ini, jika tidak, ia hanya akan dipaparkan sebagai aksara yang berasingan.

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

print(man + chr(8205) + toilet)</code>

Hasil keluaran:

<code>?‍?</code>

Sekarang mari kita lihat cara setiap aksara Unicode diwakili sebagai bait dalam pengekodan UTF-8 secara umum.

Mari kita pertimbangkan watak U 1F64B.

Pertama, kita perlu menentukan bilangan bait yang diperlukan untuk menyimpannya berdasarkan julat aksara. Kami boleh menyimpan nombor itu sendiri dalam hanya tiga bait, tetapi kemudian tidak ada cara untuk menyahkodnya kembali kepada satu aksara. Oleh itu, corak berikut digunakan: (Mengapa menggunakan corak ini?)

11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

Sekarang mari letakkan bit nombor 0x1f64b ke dalam corak ini. Mula-mula tukar kepada binari.

<code class="language-python">print(bin(0x1F64B))</code>

Hasil keluaran:

<code>0b11111011001001011</code>

Corak mempunyai 21 bit, jadi mari tambah 0 pada permulaan untuk dipadankan:

000011111011001001011
000 011111 011001 001011

Letakkan ke dalam corak: 11110000 10011111 10011001 10001011

Sekarang, apakah perwakilan heksadesimal bagi bait ini?

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

Hasil keluaran:

<code>['0xf0', '0x9f', '0x99', '0x8b']</code>

Perhatikan bahawa ini sepadan dengan empat yang pertama x yang ingin kami fahami. Sekarang anda tahu apa yang mereka maksudkan.

Nota berkaitan: https://www.php.cn/link/0da44af358e8fcb6a6c2040602172d8d

Exploring emoji encodings

Atas ialah kandungan terperinci Meneroka pengekodan emoji. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn