Emoticon tampaknya ditentukan menggunakan format U + xxxxx
dimana masing-masing x adalah digit heksadesimal.
Misalnya, U + 1F615 adalah kode Konsorsium Unicode resmi untuk "wajah bingung" π
Karena saya sering bingung, saya memiliki ikatan yang kuat dengan simbol ini.
The U + 1F615 representasi membingungkan untuk saya karena saya pikir satu-satunya pengkodean mungkin untuk karakter unicode diperlukan 8, 16, 24 atau 32 bit, sedangkan 5 digit hex membutuhkan 5x4 = 20 bit.
Saya telah menemukan bahwa simbol ini tampaknya diwakili oleh string hex yang sama sekali berbeda di bash:
$echo -n π | hexdump
0000000 f0 9f 98 95
0000004
$echo -e "\xf0\x9f\x98\x95"
π
$PS1=$'\xf0\x9f\x98\x95 >'
π >
Saya mengharapkan U + 1F615 untuk dikonversi ke sesuatu seperti \ x00 \ x01 \ xF6 \ x15 .
Saya tidak melihat hubungan antara 2 penyandian ini?
Ketika saya mencari simbol di daftar Konsorsium Unicode resmi , saya ingin dapat menggunakan kode itu secara langsung tanpa harus mengonversi secara manual dengan cara yang membosankan ini. yaitu
- menemukan simbol di beberapa halaman web
- menyalinnya ke clipboard browser web
- menempelkannya di bash untuk menggema melalui hexdump untuk menemukan kode NYATA.
Bisakah saya menggunakan kode 20-bit ini untuk menentukan apa kode 32-bit itu?
Apakah ada hubungan antara 2 angka ini?
sumber
\U1F615
diikuti oleh digit heksadesimal lain yang valid maka itu akan dianggap sebagai bagian dari urutan escape. Untuk membuatnya bekerja terlepas dari apa yang diikuti oleh itu, harus memiliki cukup nol mengarah tepat tepat delapan digit:\U0001F615
Berikut cara untuk mengkonversi dari UTF-32 (big endian) ke UTF-8
Anda akan melihat nilai hex Anda
0x01F615
di sana, diisi dengan 0 terkemuka ekstra untuk mengisi 32 bit.Halaman Wikipedia di UTF-8 menjelaskan transformasi dari titik kode Unicode ke representasi UTF-8 dengan sangat jelas. Tetapi mencoba melakukannya sendiri dalam skrip shell mungkin bukan ide terbaik.
UTF-32 adalah fixed-width, dan korespondensi antara codepoint dan representasi UTF-32 adalah sepele - nilainya sama.
sumber
Cara yang bagus untuk melakukannya di kepala atau di atas kertas:
Cari tahu berapa banyak byte yang akan dihasilkan: nilai di bawah U + 0080 adalah satu byte, jika tidak di bawah U + 0800 adalah 2 byte, selain itu di bawah U + 10000 adalah 3 byte, atau 4 byte. Dalam kasus Anda, 4 byte.
Convert hex ke oktal:
0373025
.Mulai di akhir, peel off 2 oktal digit pada suatu waktu untuk mendapatkan urutan nilai oktal:
037
030
025
.Jika Anda memiliki nilai oktal lebih sedikit dari jumlah yang diharapkan dari byte, menambahkan ekstra 0 di awal:
000
037
030
025
.Untuk semua tapi yang pertama, menambahkan
0200
untuk mendapatkan:000
0237
0230
0225
.Untuk pertama, tambahkan
0300
jika panjang diharapkan adalah 2,0340
jika itu 3, atau0360
jika itu 4, untuk mendapatkan:360
0237
0230
0225
.Sekarang menulis sebagai string lolos oktal:
\360\237\230\225
. Secara opsional ubah kembali ke hex jika Anda mau.sumber