Emoji di bawah tenda

gambar




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 gambar" 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: gambarserta layar «GHz» sebagai mesin terbang tunggal: gambar.



Diarahkan untuk panah dua berkepala benar dengan bulu dan dua garis vertikal: gambaratau Semiglazov Rakasa: gambar. Dan bebeknya:



gambar




Perhatikan blok dengan hieroglif Mesir (U + 13000 - U + 1342F), ada banyak hal menarik:



gambar




Emoji dasar



Emoji hanyalah karakter Unicode, yang terletak di sini U + 1F300-1F6FF dan di sini U + 1F900-1FAFF:



gambar




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, gambarkomputer 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.



gambar



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.



gambar



Font pengganti



Anda menulis teks dalam beberapa font, bagaimana emoji pas di sana? Dan mengapa teks Rusia terlihat buruk di Clubhouse atau di Medium?



gambar




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: gambar.

Font apa pun yang Anda gunakan, emoji terlihat sama.



gambar




Variation selector-16



Beberapa emoji berasal dari bentuk ikon pada tahun 1993, di bagian Miscellaneous Symbols U + 2600-26FF atau Dingbats U + 2700-27FF:



gambar




Mesin terbang ini seperti huruf, hitam dan putih. Banyak font memiliki sendiri gambar(U + 2702 BLACK SCISSORS):



gambar




Apple Color Emoji memiliki versinya sendiri:



gambar




Bagaimana OS tahu apa yang akan ditampilkan gambaratau gambarjika 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.



gambar




Sederhana, elegan, dan tidak perlu menyoroti titik kode baru. gambarmemiliki 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. gambarMerupakan 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.



gambar




Akhirnya, Anda tidak bisa begitu saja memanggil .length



string. Ya, Anda bisa, tetapi hasilnya akan mengejutkan Anda. Jika Anda seorang pengembang, coba jalankan gambardi 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.



gambar




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 gambar(TANDA TANGAN GELOMBANG U + 1F44B), dan kemudian (U + 1F3FD MEDIUM SKIN TONE MODIFIER), maka kita mendapatkannya gambar



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



gambar




Penyambung lebar nol



Misalkan teman Anda baru saja mengirimi Anda foto apel yang dia tanam di kebunnya. Anda perlu menjawab - bagaimana? Anda dapat mengirim gambarWOMAN EMOJI (U + 1F469) dengan gambaralas nasi SETENGAH BERAS (U + 1F33E). Pada akhirnya, ini akan berhasil gambar, tetapi jika Anda menampar U + 200D di antara mereka, maka Anda akan mendapatkan seorang petani: gambar



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:



gambar




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.



gambar




Sayangnya, beberapa emoji tidak diimplementasikan sebagai kombinasi dengan ZWJ. Saya menganggap ini sebagai kesempatan yang terlewatkan:



gambar




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:



gambar




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.



gambar




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: gambar(kecuali bahwa pengeditan teks mulai berperilaku aneh).



Jika Anda ingin bereksperimen, silakan salin dan gabungkan dari alfabet ini: gambar



Ada 258 kombinasi dua huruf yang valid. Bisakah kamu menemukan semuanya?



Efek samping yang menyenangkan dari pengikat dua huruf: gambar



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:



gambar




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



gambar




Ada 12 di antaranya:



gambar




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



Inilah yang saya lihat pada Maret 2021: gambar



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:



  1. Titik kode tunggal gambar
  2. Titik kode tunggal + pemilih variasi-16 gambar
  3. Pengubah Rona Kulit gambar
  4. Mengurutkan dengan joiner lebar-nol gambar
  5. Bendera gambar
  6. Urutan tag gambar
  7. Urutan keycap gambar


Metode dari 1-4 dapat digabungkan untuk membuat pos yang agak rumit:



gambar




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.



gambar








gambar



Lowongan
, , , - .



, , , .



, , . , , , , , .



, , .







Tentang ITELMA
- automotive . 2500 , 650 .



, , . ( 30, ), -, -, - (DSP-) .



, . , , , . , automotive. , , .


Daftar publikasi bermanfaat tentang Habré



All Articles