Selama beberapa minggu terakhir, Nikita Prokopov telah menerapkan dukungan emoji untuk Skija . Dia memutuskan untuk membagikan beberapa detail kecil tentang bagaimana "inovasi terbesar dalam komunikasi manusia sejak ditemukannya surat
" ini bekerja di bawah tenda.
Catatan penerjemah: Habr tidak mendukung emoji, jadi saya harus keluar dan mengganti emoji dengan gambar.
Unicode
Setiap karakter di komputer dikodekan dengan angka. Pengkodean paling populer adalah Unicode, dan dua subvarian paling umum adalah UTF-8 dan UTF-16.
Unicode mengalokasikan 2 21 (2 juta) karakter yang disebut "titik kode". Dari dua juta ini, hanya ~ 150 ribu karakter yang saat ini ditentukan. Semua bahasa, mati dan hidup, dan dekorasi lainnya dijejalkan ke dalam 150.000 simbol ini. Anda dapat menggunakan font yang berbeda untuk menulis mundur dan terbalik:
serta layar «GHz» sebagai mesin terbang tunggal:
.
Diarahkan untuk panah dua berkepala benar dengan bulu dan dua garis vertikal:
atau Semiglazov Rakasa:
. Dan bebeknya:
Perhatikan blok dengan hieroglif Mesir (U + 13000 - U + 1342F), ada banyak hal menarik:
Emoji dasar
Emoji hanyalah karakter Unicode, yang terletak di sini U + 1F300-1F6FF dan di sini U + 1F900-1FAFF:
Emoji berperilaku seperti huruf biasa, Anda dapat melakukan semua operasi dengannya, seperti pada huruf ( kira-kira diterjemahkan: tidak hanya pada Habré! ). Saat Anda mengetik "A", komputer melihat U + 0041. Saat Anda mengetik,
komputer melihat U + 1F335.
Emoji adalah font
Mengapa mereka ditampilkan sebagai gambar? Font bitmap. Anda dapat membuat png lucu untuk mesin terbang daripada vektor hitam dan putih yang membosankan.
Setiap OS dilengkapi dengan font emoji yang sudah diinstal sebelumnya. Di macOS / iOS, ini adalah Apple Color Emoji. Windows - Segoe UI Emoji, Android - Noto Color Emoji.
Emoji, seperti font, terlihat berbeda di berbagai perangkat. Beberapa aplikasi memiliki emoji sendiri: WhatsApp, Twitter, Facebook.
Font pengganti
Anda menulis teks dalam beberapa font, bagaimana emoji pas di sana? Dan mengapa teks Rusia terlihat buruk di Clubhouse atau di Medium?
Di sini Anda mengetik karakter U + 1F419, dan font Anda, misalnya, San Francisco. Tetapi font San Francisco tidak memiliki mesin terbang untuk U + 1F419, jadi OS Anda mulai mencari font lain yang memiliki mesin terbang seperti itu.
U + 1F419 hanya tersedia di Apple Color Emoji. Jadi Anda lihat ini:
.
Font apa pun yang Anda gunakan, emoji terlihat sama.
Variation selector-16
Beberapa emoji berasal dari bentuk ikon pada tahun 1993, di bagian Miscellaneous Symbols U + 2600-26FF atau Dingbats U + 2700-27FF:
Mesin terbang ini seperti huruf, hitam dan putih. Banyak font memiliki sendiri
(U + 2702 BLACK SCISSORS):
Apple Color Emoji memiliki versinya sendiri:
Bagaimana OS tahu apa yang akan ditampilkan
atau
jika mereka memiliki kode U + 2702 yang sama?
Perkenalkan U + FE0F, juga dikenal sebagai VARIATION SELECTOR-16. Ini adalah petunjuk bagi pembuat teks untuk beralih ke emoji.
Sederhana, elegan, dan tidak perlu menyoroti titik kode baru.
memiliki arti yang sama
, tetapi gaya gambarnya sedikit berbeda.
Kelompok grafem
Di sini kita dihadapkan pada masalah lain - emoji kita sekarang bukan hanya satu titik kode, tetapi dua. Artinya kita membutuhkan cara untuk menentukan batas-batas simbol.
Sekelompok grafem akan membantu kami. Gugus grafem adalah urutan titik kode yang dipandang sebagai mesin terbang tunggal yang dapat dibaca manusia.
Kluster grafem diciptakan tidak hanya untuk emoji, tetapi juga berlaku untuk huruf biasa.
Merupakan cluster tunggal grafem, meskipun terdiri dari dua titik kode: U + 0055 UPPER-CASE U diikuti oleh U + 0308 GABUNGAN DIAERESIS.
Kluster grafem menimbulkan banyak kerumitan bagi pemrogram. Anda tidak bisa begitu saja
substring(0, 10)
untuk mengambil 10 karakter pertama - Anda dapat membagi emoji menjadi dua.
Kebalikan dari garis harus dilakukan dengan cerdik. U + 263A U + FE0F masuk akal, tetapi U + FE0F U + 263A tidak.
Akhirnya, Anda tidak bisa begitu saja memanggil
.length
string. Ya, Anda bisa, tetapi hasilnya akan mengejutkan Anda. Jika Anda seorang pengembang, coba jalankan
di konsol browser Anda.
Tip programmer: Jika Anda bekerja dengan teks, dapatkan perpustakaan yang berfokus pada cluster grafem. Untuk C, C ++ dan JVM dapat menjadi ICU , Swift melakukan semuanya dengan benar secara default, untuk orang lain - lakukan sendiri.
Benda ini panjangnya 65 dan tidak bisa dibelah. Hiduplah dengan itu sekarang.
Pengubah Rona Kulit
Kebanyakan emoji manusia menggambarkan orang kuning abstrak. Jika warna kulit ditambahkan pada tahun 2015, alih-alih menambahkan titik kode baru untuk setiap kombinasi emoji dan warna kulit, hanya lima titik kode baru yang ditambahkan: U + 1F3FB..U + 1F3FF
Mereka tidak boleh digunakan sendiri, tetapi harus ditambahkan ke emoji yang ada ... Bersama-sama mereka membentuk ligatur: jika kita mencetak
(TANDA TANGAN GELOMBANG U + 1F44B), dan kemudian (U + 1F3FD MEDIUM SKIN TONE MODIFIER), maka kita mendapatkannya
tidak memiliki titik kode sendiri (ini adalah urutan dua: U + 1F44B U + 1F3FD), tetapi memiliki tampilan dan nuansanya yang unik. Secara total, dengan bantuan lima pengubah, ~ 280 emoji manusia diubah menjadi 1680 variasi. Berikut beberapa penari:
Penyambung lebar nol
Misalkan teman Anda baru saja mengirimi Anda foto apel yang dia tanam di kebunnya. Anda perlu menjawab - bagaimana? Anda dapat mengirim
WOMAN EMOJI (U + 1F469) dengan
alas nasi SETENGAH BERAS (U + 1F33E). Pada akhirnya, ini akan berhasil
, tetapi jika Anda menampar U + 200D di antara mereka, maka Anda akan mendapatkan seorang petani:
U + 200D disebut Zero-width Joiner, atau disingkat ZWJ. Ini berfungsi dengan cara yang mirip dengan apa yang kita lihat dengan warna kulit, tetapi kali ini Anda dapat menggabungkan dua emoji mandiri menjadi satu. Tidak semua kombinasi berfungsi, tetapi banyak yang berhasil, terkadang dengan cara yang mengejutkan!
Beberapa contoh:
Satu ketidakkonsistenan aneh yang saya perhatikan adalah bahwa warna rambut dilakukan melalui ZWJ, sedangkan warna kulit hanyalah pengubah emoji tanpa ZWJ. Mengapa? Saya tidak punya ide.
Sayangnya, beberapa emoji tidak diimplementasikan sebagai kombinasi dengan ZWJ. Saya menganggap ini sebagai kesempatan yang terlewatkan:
Bagaimana cara mencetak ZWJ? Tidak mungkin. Tapi Anda bisa menyalinnya dari sini: "". Catatan: Ini adalah karakter khusus, jadi harap berperilaku aneh. Anda tidak melihatnya, tapi dia. ( catatan per: di artikel asli ada, tetapi Habr tidak mengizinkan )
Area besar lain di mana ZWJ berada di atas kuda adalah konfigurasi keluarga dan hubungan. Berikut cerita pendek untuk diilustrasikan:
Bendera
Bendera negara adalah bagian dari standar Unicode, tetapi untuk beberapa alasan tidak diterapkan di Windows. Jika Anda membaca ini di browser Windows - maaf!
Bendera tidak memiliki titik kode khusus. Sebaliknya, mereka adalah pengikat dua huruf.
Kiri - Windows, kanan - Mac
True, mereka tidak menggunakan huruf asli. Sebagai gantinya, alfabet "huruf simbol indikator regional" (U + 1F1E6..1F1FF) digunakan. Surat-surat ini tidak digunakan untuk apa pun selain membuat bendera.
Apa yang terjadi jika Anda menggabungkan dua huruf acak? Tidak banyak:
(kecuali bahwa pengeditan teks mulai berperilaku aneh).
Jika Anda ingin bereksperimen, silakan salin dan gabungkan dari alfabet ini:
Ada 258 kombinasi dua huruf yang valid. Bisakah kamu menemukan semuanya?
Efek samping yang menyenangkan dari pengikat dua huruf:
Urutan tag
Pengikat dua huruf itu keren, tetapi tidakkah Anda ingin lebih keren? Bagaimana dengan 32 pengikat huruf? Berikut urutan tagnya.
Urutan tag adalah urutan emoji biasa, diikuti oleh jenis huruf Latin lainnya (U + E0020..E007E), diakhiri dengan U + E007F BATALKAN TAG.
Mereka saat ini hanya digunakan untuk tiga bendera berikut: Inggris, Skotlandia dan Wales:
Keycaps
Tidak terlalu menarik, tetapi diperlukan untuk kelengkapan: Urutan keycaps menggunakan konvensi lain.
Ini terlihat seperti ini: ambil angka * atau #, ubah menjadi emoji dengan U + FE0F, bungkus dalam kotak dengan U + 20E3 COMBINING ENCLOSING KEYCAP
Ada 12 di antaranya:
Pembaruan unicode
Unicode diperbarui setiap tahun dan emoji adalah bagian inti dari setiap rilis. Misalnya, di Unicode 13 (Maret 2020) 55 emoji baru ditambahkan.
Pada saat penulisan ini, baik Mac OS (11.2.3) atau iOS (14.4.1) terbaru tidak mendukung emoji dari tipe Unicode 13:
Inilah yang saya lihat pada Maret 2021:
Namun berkat keajaiban ZWJ, saya masih bisa memahami apa yang terjadi tidak dengan cara yang paling optimal.
Kesimpulan
Untuk meringkas, ada tujuh cara untuk menyandikan emoji:
- Titik kode tunggal

- Titik kode tunggal + pemilih variasi-16

- Pengubah Rona Kulit

- Mengurutkan dengan joiner lebar-nol

- Bendera

- Urutan tag

- Urutan keycap

Metode dari 1-4 dapat digabungkan untuk membuat pos yang agak rumit:
Jika Anda seorang programmer, ingatlah untuk selalu menggunakan perpustakaan ICU untuk:
- ekstraksi substring
- pengukuran panjang garis
- string terbalik
Kata kunci googling adalah "Grapheme Cluster". Ini berlaku untuk emoji, diakritik Barat, induksi, dan font Korea, jadi harap berhati-hati.
- Sistem kontrol serial pertama Rusia untuk mesin bahan bakar ganda dengan pemisahan fungsi pengontrol
- Ada lebih banyak baris kode di mobil modern daripada ...
- Kursus Online Gratis di Otomotif, Dirgantara, Robotika dan Teknik (50+)
- McKinsey: memikirkan kembali perangkat lunak dan arsitektur elektronik di otomotif
Tentang ITELMA
Daftar publikasi bermanfaat tentang Habré