J'utilise Arch Linux avec un terminal simple en utilisant la police Adobe Source Code Pro. Mes paramètres régionaux sont correctement définis sur LANG=en_US.UTF-8
.
Je souhaite imprimer des caractères Unicode représentant des cartes à jouer sur mon terminal. J'utilise Wikipedia pour référence .
Les caractères Unicode pour les combinaisons de cartes fonctionnent bien. Par exemple, l'émission
$ printf "\u2660"
imprime un cœur noir à l'écran.
Cependant, j'ai des problèmes avec des cartes à jouer spécifiques. Délivrance
$ printf "\u1F0A1"
imprime le symbole Ἂ1
au lieu de l'as de pique 🂡. Qu'est-ce qui ne va pas?
Ce problème persiste sur plusieurs terminaux (urxvt, xterm, termite) et toutes les polices que j'ai essayées (DejaVu, Inconsolata).
Réponses:
help printf
diffèreprintf(1)
pour les séquences d'échappement interprétées, et les documents pour GNU printf disent:Quelque chose de similaire est spécifié dans le manuel Bash pour ANSI C Quoting et
echo
:En bref:
\u
n'est pas pour 5 chiffres hexadécimaux. C'est\U
:la source
La réponse de Muru est complètement correcte, mais juste pour clarifier un point:
Lorsque vous imprimez
\u1F0A1
, cela est interprété comme un échappement Unicode de seize bits\u1F0A
, suivi du caractère littéral1
(puisqu'il\u
prend les quatre caractères suivants, ni plus, ni moins). U + 1F0A donne alorsἊ
, un alpha grec avec deux diacritiques dessus ( lettre majuscule grecque Alpha avec Psili et Varia , pour être précis).Si vous voulez plus de seize bits dans votre échappement Unicode, vous devez utiliser
\U
, ce qui prend la valeur de hex de huit caractères:\U0001F0A1
vous donnera la carte à jouer.la source
\U0001F0A1
est en fait plus portable que\U1F0A1
. C'est l'printf
utilitaire GNU autonome qui a introduit ces séquences\uXXXX
/\UXXXXXXXX
et il nécessite 4 chiffres pour\u
et 8 pour\U
. D'autresprintf
implémentations comme le shell intégré GNU, ksh93 et zsh sont plus laxistes. En tout cas ceprintf '\u/\U'
n'est pas POSIX. POSIX va cependant spécifier des zsh$'\U1F0A1'
et ne nécessitera pas les 8 chiffres.\uxxxx
est jusqu'à 4 chiffres et\Uxxxxxxxx
est jusqu'à 8 chiffres. Notez que Unicode est désormais limité aux points de code 0 à 0x10FFFF (une limitation apportée par UTF16), de sorte que les points de code n'auront jamais plus de 6 chiffres (toujours\U123456789
serait interprété comme le caractère du point de code 0x12345678 suivi9
et échoué). La spécification POSIX pour$'\u\U'
n'est toujours pas finalisée (voir austingroupbugs.net/view.php?id=249 ). Dans une version antérieure, ils exigeaient tous les 4/8 chiffres, mais cela a changé plus tard (à ma demande).