web-dev-qa-db-fra.com

Pourquoi certains caractères Unicode ne s'impriment-ils pas sur mon terminal?

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).

16
Brian Fitzpatrick

help printf Passe à printf(1) pour les séquences d'échappement interprétées, et les documents pour GNU printf dit:

printf interprète deux syntaxes de caractères introduites dans ISO C 99: \u pour les caractères Unicode 16 bits (ISO/IEC 10646), spécifiés en quatre chiffres hexadécimaux hhhh , et \U pour les caractères Unicode 32 bits, spécifiés en huit chiffres hexadécimaux hhhhhhhh . printf affiche les caractères Unicode en fonction des paramètres régionaux LC_CTYPE. Les caractères Unicode dans les plages U + 0000… U + 009F, U + D800… U + DFFF ne peuvent pas être spécifiés par cette syntaxe, sauf pour U + 0024 ($), U + 0040 (@) et U + 0060 (`) .

Quelque chose de similaire est spécifié dans le manuel de Bash pour ANSI C Quoting et echo :

\uHHHH
le caractère Unicode (ISO/IEC 10646) dont la valeur est la valeur hexadécimale [~ # ~] hhhh [~ # ~] ( un à quatre chiffres hexadécimaux)

\UHHHHHHHH
le caractère Unicode (ISO/IEC 10646) dont la valeur est la valeur hexadécimale [~ # ~] hhhhhhhh [~ # ~] ( un à huit chiffres hexadécimaux)

En bref: \u N'est pas pour 5 chiffres hexadécimaux. C'est \U:

# printf "\u2660 \u1F0A1 \U1F0A1\n"
♠ Ἂ1 ????
27
muru

La réponse de Muru est complètement correcte, mais juste pour clarifier un point:

Lorsque vous imprimez \u1F0A1, c'est interprété comme un échappement Unicode de seize bits \u1F0A, suivi du caractère littéral 1 (depuis \u prend les caractères quatre 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, qui prend la valeur hexadécimale de huit caractères: \U0001F0A1 vous donnera la carte à jouer.

2
Draconis