Saya ingin menambahkan tengkorak Unicode dan tulang bersilang ke shell prompt saya (khususnya 'TENGKORAK DAN CROSSBON' (U + 2620)), tapi saya tidak tahu mantra sihir untuk membuat gema meludah, atau yang lainnya, Karakter Unicode 4 digit. Yang dua digit itu mudah. Misalnya, gema -e "\ x55",.
Selain jawaban di bawah ini, perlu dicatat bahwa, terminal Anda perlu mendukung Unicode agar hasilnya sesuai dengan yang Anda harapkan. gnome-terminal melakukan tugasnya dengan baik, tetapi ini tidak selalu dihidupkan secara default.
Pada aplikasi Terminal macOS Buka Preferences-> Encodings dan pilih Unicode (UTF-8).
bash
shell
unicode
character-encoding
masukomi
sumber
sumber
"\x7F"
di UTF-8 lokal (yang menurutbash
tag ini milik Anda) ... ... pola yang diwakili oleh satu byte tidak pernah berada dalam kisaran\x80-\xFF
. Kisaran ini ilegal dalam karakter UTF-8 singl-byte. misalnya nilai Unicode CodepointU+0080
(mis.\x80
) sebenarnya 2 byte di UTF-8 ..\xC2\x80
..printf "\\u007C\\u001C"
.gnome-terminal
,echo -e '\ufc'
tidak menghasilkan ü, bahkan dengan pengkodean karakter diatur ke UTF-8. Namun, mis.urxvt
Apakah mencetak misprintf "\\ub07C\\ub01C"
seperti yang diharapkan (tidak dengan atau kotak).bash
tag itu petunjuk yang sangat berguna? Apakah terminal berbeda umum di CJK atau ...?Jawaban:
Dalam UTF-8 sebenarnya 6 digit (atau 3 byte).
Untuk memeriksa bagaimana itu dikodekan oleh konsol, gunakan hexdump:
sumber
LANG=C
sebagai gantinyaLANG=en_US.UTF-8
. Sekarang terminal saya di Gnome menunjukkan simbol dengan benar ... Terminal yang sebenarnya (tty1-6) masih belum.0000000 f0 9f 8d ba
terjemahkan ke\xf0\x9f\x8d\xba
. Contoh gema:echo -e "\xf0\x9f\x8d\xba"
.$'...'
sintaks untuk memasukkan karakter yang dikodekan ke variabel tanpa menggunakan$(...)
subkulit menangkap, untuk digunakan dalam konteks yang tidak menafsirkan sendiri urutan pelarian:skull=$'\xE2\x98\xA0'
0000000 98e2 00a0
. Tentu saja0000000
ini hanya offset yang tidak penting, tetapi byte setelah diterjemahkan\xe2\x98\xa0
, karena mesin menggunakan urutan byte endian kecil.Ini berfungsi di Zsh (saya sudah memeriksa versi 4.3) dan di Bash 4.2 atau lebih baru.
sumber
Selama editor teks Anda dapat mengatasi Unicode (mungkin dikodekan dalam UTF-8) Anda dapat memasukkan titik kode Unicode secara langsung.
Misalnya, dalam editor teks Vim Anda akan masuk ke mode penyisipan dan tekan Ctrl+ V+ Udan kemudian nomor kode-titik sebagai angka heksadesimal 4 digit (pad dengan nol jika perlu). Jadi, Anda akan mengetik Ctrl+ V+U 2 6 2 0 . Lihat: Apa cara termudah untuk memasukkan karakter Unicode ke dalam dokumen?
Di terminal yang menjalankan Bash Anda akan mengetik CTRL+SHIFT + Udan mengetikkan kode-heksadesimal karakter yang Anda inginkan. Selama input, kursor Anda harus menunjukkan garis bawah
u
. Non-digit pertama yang Anda ketikkan input berakhir, dan merender karakter. Jadi, Anda dapat mencetak U + 2620 di Bash menggunakan yang berikut:echo CTRL+ SHIFT+U2620ENTERENTER
(Masukan pertama mengakhiri input Unicode, dan yang kedua menjalankan
echo
perintah.)Kredit: Tanyakan Ubuntu SE
sumber
C-S-u 2 6 2 0
adalah fitur emulator terminal Anda, Metode Input X (XIM), atau yang serupa. AFAIK, Anda tidak akan dapat mengirim keduanyaSHIFT
danCTRL
ke lapisan terminal. Terminal hanya berbicara dalam karakter, bukan dalam keyyms dan kode kunci seperti server X Anda (juga, itu adalah 7-bit untuk semua maksud dan tujuan). Di dunia ini,CTRL
topeng 4 bit paling signifikan (& 0b00001111) yang menghasilkanBerikut ini adalah implementasi Bash sepenuhnya internal, tidak ada forking, ukuran tak terbatas dari karakter Unicode.
Output adalah:
sumber
Masukkan "☠" ke dalam skrip shell Anda. Di tempat yang benar dan di konsol yang mendukung Unicode, ia akan mencetak dengan baik:
"Pemecahan masalah" yang jelek akan menghasilkan urutan UTF-8, tetapi itu juga tergantung pada pengkodean yang digunakan:
sumber
Satu garis cepat untuk mengkonversi karakter UTF-8 ke dalam format 3-byte:
sumber
printf "\\\x%s" $(printf '☠'|xxd -p -c1 -u)
.... xxd dikirimkan sebagai bagian dari paket 'vim-common'hexFromGlyph(){ if [ "$1" == "-n" ]; then outputSeparator=' '; shift; else outputSeparator='\n'; fi for glyph in "$@"; do printf "\\\x%s" $(printf "$glyph"|xxd -p -c1 -u); echo -n -e "$outputSeparator"; done } # usage: $ hexFromGlyph ☠ ✿ \xE2\x98\xA0 \xE2\x9C\xBF $ hexFromGlyph -n ☠ ✿ \xE2\x98\xA0 \xE2\x9C\xBF
codepoints () { printf 'U+%04x\n' ${@/#/\'} ; } ; codepoints A R ☯ 🕉 z
... selamat menikmati 👍Saya menggunakan ini:
Ini lebih mudah daripada mencari representasi hex ... Saya menggunakan ini dalam skrip shell saya. Itu bekerja pada AFAIK istilah-gnome dan urxvt.
sumber
Anda mungkin perlu menyandikan titik kode sebagai oktal agar ekspansi yang cepat dapat mendekodekannya dengan benar.
U + 2620 disandikan sebagai UTF-8 adalah E2 98 A0.
Jadi di Bash,
akan membuat cangkang Anda menjadi tengkorak dan tulang.
sumber
Dalam bash untuk mencetak karakter Unicode ke output gunakan \ x, \ u atau \ U (pertama untuk 2 digit hex, kedua untuk hex 4 digit, ketiga untuk panjang apa pun)
Saya ingin menetapkannya ke variabel, gunakan sintaks $ '...'
sumber
Jika Anda tidak keberatan dengan Perl one-liner:
-CS
memungkinkan UTF-8 decoding pada input dan encoding UTF-8 pada output.-E
mengevaluasi argumen berikutnya sebagai Perl, dengan fitur-fitur modern sepertisay
diaktifkan. Jika Anda tidak ingin baris baru di bagian akhir, gunakanprint
sebagai gantisay
.sumber
Salah satu dari tiga perintah ini akan mencetak karakter yang Anda inginkan di konsol, asalkan konsol tersebut menerima karakter UTF-8 (sebagian besar saat ini melakukannya):
Setelah itu, Anda dapat menyalin dan menempelkan mesin terbang (gambar, karakter) yang sebenarnya ke editor teks apa pun (yang diaktifkan UTF-8).
Jika Anda perlu melihat bagaimana Unicode Code Point dikodekan dalam UTF-8, gunakan xxd (hex viewer yang jauh lebih baik daripada od):
Atau, dalam HEX untuk menghindari kesalahan: 0xE2 0x98 0xA0. Yaitu, nilai-nilai antara spasi (HEX 20) dan Line-Feed (Hex 0A).
Jika Anda ingin terjun lebih dalam ke konversi angka menjadi karakter: lihat di sini untuk melihat artikel dari wiki Greg (BashFAQ) tentang pengkodean ASCII di Bash!
sumber
The
printf
builtin (hanya sebagai coreutils'printf
) tahu\u
urutan escape yang menerima 4 digit Unicode karakter:Tes dengan Bash 4.2.37 (1):
sumber
\printf
menggunakan executable mandiri, atau coba dengan upgrade bashMaaf telah menghidupkan kembali pertanyaan lama ini. Tetapi ketika menggunakan
bash
ada pendekatan yang sangat mudah untuk membuat Unicode codepoint dari input ASCII biasa, yang bahkan tidak bercabang sama sekali:Gunakan sebagai berikut untuk menentukan titik-titik kode tertentu
atau untuk membuang 65536 unicode codepoints ke stdout (membutuhkan waktu kurang dari 2 pada mesin saya. Ruang tambahan adalah untuk mencegah karakter tertentu saling mengalir karena font monospace shell):
atau untuk menceritakan kisah orang tua yang sangat tipikal (ini membutuhkan Unicode 2010):
Penjelasan:
printf '\UXXXXXXXX'
mencetak karakter Unicodeprintf '\\U%08x' number
mencetak\UXXXXXXXX
dengan nomor yang dikonversi ke Hex, ini kemudian diumpankan ke yang lainprintf
untuk benar-benar mencetak karakter Unicodeprintf
mengenali oktal (0oct), hex (0xHEX) dan desimal (0 atau angka dimulai dengan 1 hingga 9) sebagai angka, sehingga Anda dapat memilih representasi mana yang paling cocokprintf -v var ..
mengumpulkan keluaranprintf
menjadi variabel, tanpa garpu (yang sangat mempercepat hal-hal)local variable
ada di sana untuk tidak mencemari namespace globallocal -n var=other
aliasvar
untukother
, tugas seperti itu untukvar
alterother
. Satu bagian yang menarik di sini adalah, ituvar
adalah bagian dari namespace lokal, sementaraother
adalah bagian dari namespace global.local
atauglobal
namespace dibash
. Variabel disimpan di lingkungan, dan itu selalu bersifat global. Lokal hanya membuang nilai saat ini dan mengembalikannya ketika fungsi dibiarkan lagi. Fungsi-fungsi lain yang dipanggil dari dalam fungsi denganlocal
masih akan melihat nilai "lokal". Ini adalah konsep yang secara fundamental berbeda dari semua aturan pelingkupan normal yang ditemukan dalam bahasa lain (dan apa yangbash
dilakukannya sangat kuat tetapi dapat menyebabkan kesalahan jika Anda seorang programmer yang tidak menyadarinya).sumber
Berikut adalah daftar semua emoji unicode yang tersedia:
https://en.wikipedia.org/wiki/Emoji#Unicode_blocks
Contoh:
Untuk mendapatkan nilai ASCII dari karakter ini gunakan hexdump
Dan kemudian gunakan nilai-nilai yang diinformasikan dalam format hex
sumber
Berdasarkan pada pertanyaan Stack Overflow , potong Unix, hapus token pertama dan https://stackoverflow.com/a/15903654/781312 :
Outputnya adalah sebagai berikut.
sumber
Mudah dengan Python2 / 3 one-liner:
Hasil dalam:
sumber
Di Bash:
Keluaran:
sumber
Jika nilai hex karakter unicode diketahui
Jika nilai desimal karakter unicode diketahui
sumber