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'))
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.
emoji = '??♂️' print("Length: ", len(emoji)) for c in emoji: code = ord(c) print("{}\t{}\t{}".format(code, hex(code), c))
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.
print(chr(128587) + chr(127997))
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.
heart_symbol= '♥' print(heart_symbol) print(heart_symbol + chr(65039))
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.
woman = '?' laptop = '?' print(woman + chr(8205) + laptop)
Hasil keluaran:
<code>??</code>
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)
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.
print(bin(0x1F64B))
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?
print(list(map(hex, [0b11110000, 0b10011111, 0b10011001, 0b10001011])))
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
Atas ialah kandungan terperinci Meneroka pengekodan emoji. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!