Rumah > pembangunan bahagian belakang > Tutorial Python > Meneroka pengekodan emoji

Meneroka pengekodan emoji

Barbara Streisand
Lepaskan: 2025-01-23 04:12:13
asal
852 orang telah melayarinya

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

Adakah anda cuba menukar rentetan yang mengandungi Emoji kepada bait?

text = 'Hi ??‍♂️'

print(bytes(text, 'utf-8'))
Salin selepas log masuk

Hasil keluaran:

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

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.

emoji = '??‍♂️'
print("Length: ", len(emoji))
for c in emoji:
    code = ord(c)
    print("{}\t{}\t{}".format(code, hex(code), c))
Salin selepas log masuk

Hasil keluaran:

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

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.

print(chr(128587) + chr(127997))
Salin selepas log masuk

Hasil keluaran:

<code>??</code>
Salin selepas log masuk

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.

heart_symbol= '♥'
print(heart_symbol)
print(heart_symbol + chr(65039))
Salin selepas log masuk

Hasil keluaran:

<code>♥
♥️</code>
Salin selepas log masuk

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.

woman = '?'
laptop = '?'
print(woman + chr(8205) + laptop)
Salin selepas log masuk

Hasil keluaran:

<code>?‍?</code>
Salin selepas log masuk
Salin selepas log masuk

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

man = '?'
toilet = '?'

print(man + chr(8205) + toilet)
Salin selepas log masuk

Hasil keluaran:

<code>?‍?</code>
Salin selepas log masuk
Salin selepas log masuk

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.

print(bin(0x1F64B))
Salin selepas log masuk

Hasil keluaran:

<code>0b11111011001001011</code>
Salin selepas log masuk

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?

print(list(map(hex, [0b11110000, 0b10011111, 0b10011001, 0b10001011])))
Salin selepas log masuk

Hasil keluaran:

<code>['0xf0', '0x9f', '0x99', '0x8b']</code>
Salin selepas log masuk

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 Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan