Saya menjalankan Arch Linux dengan terminal sederhana menggunakan font Adobe Source Code Pro. Lokal saya diatur dengan benar ke LANG=en_US.UTF-8
.
Saya ingin mencetak karakter Unicode yang mewakili kartu bermain ke terminal saya. Saya menggunakan Wikipedia untuk referensi .
Karakter Unicode untuk setelan kartu berfungsi dengan baik. Misalnya, menerbitkan
$ printf "\u2660"
mencetak hati hitam ke layar.
Namun, saya mengalami masalah dengan kartu remi tertentu. Penerbitan
$ printf "\u1F0A1"
mencetak simbol Ἂ1
sebagai ganti kartu as 🂡. Apa yang salah?
Masalah ini tetap ada di beberapa terminal (urxvt, xterm, rayap) dan setiap font yang saya coba (DejaVu, Inconsolata).
Jawaban:
help printf
Defers toprintf(1)
for the escape sequence ditafsirkan, dan dokumen untuk GNU printf mengatakan:Sesuatu yang serupa ditentukan dalam manual Bash untuk ANSI C Quoting dan
echo
:Singkatnya:
\u
bukan untuk 5 digit hex. Itu\U
:sumber
Jawaban Muru sepenuhnya benar, tetapi hanya untuk memperjelas satu hal:
Saat Anda mencetak
\u1F0A1
, itu ditafsirkan sebagai pelarian Unicode enam belas-bit\u1F0A
, diikuti oleh karakter literal1
(karena\u
mengambil empat karakter berikut , tidak lebih, tidak kurang). U + 1F0A kemudian memberikanἊ
, alfa Yunani dengan beberapa diakritik di atasnya ( Huruf Ibrani Yunani dengan Psili dan Varia , tepatnya).Jika Anda ingin lebih dari enam belas bit dalam pelarian Unicode Anda, Anda perlu menggunakan
\U
, yang membutuhkan hex delapan karakter:\U0001F0A1
akan memberi Anda kartu bermain.sumber
\U0001F0A1
sebenarnya lebih portabel daripada\U1F0A1
. Ini adalahprintf
utilitas mandiri GNU yang pertama kali memperkenalkan mereka\uXXXX
/\UXXXXXXXX
urutan dan memang membutuhkan 4 digit untuk\u
dan 8 untuk\U
.printf
Implementasi lain seperti built-in dari GNU shell, ksh93 dan zsh lebih longgar. Bagaimanapunprintf '\u/\U'
juga bukan POSIX. Namun POSIX akan menentukan zsh$'\U1F0A1'
dan tidak akan membutuhkan semua 8 digit.\uxxxx
adalah sampai dengan 4 digit dan\Uxxxxxxxx
merupakan sampai 8 digit. Perhatikan bahwa Unicode sekarang terbatas pada titik kode 0 hingga 0x10FFFF (batasan yang dibawa oleh UTF16) sehingga titik kode tidak akan pernah memiliki lebih dari 6 digit (masih\U123456789
akan ditafsirkan sebagai karakter titik kode 0x12345678 diikuti oleh9
dan gagal). Spesifikasi POSIX untuk$'\u\U'
masih belum selesai (lihat austingroupbugs.net/view.php?id=249 ). Dalam draft sebelumnya, mereka membutuhkan semua 4/8 digit tetapi itu berubah kemudian (atas permintaan saya).