Estou executando o Arch Linux com um terminal simples usando a fonte do Adobe Source Code Pro. Minha localidade está definida corretamente como LANG=en_US.UTF-8
.
Quero imprimir caracteres Unicode representando cartas de baralho no meu terminal. Estou usando a Wikipedia para referência .
Os caracteres Unicode para cartões funcionam bem. Por exemplo, emitindo
$ printf "\u2660"
imprime um coração preto na tela.
No entanto, estou tendo problemas com cartas de baralho específicas. Emissão
$ printf "\u1F0A1"
imprime o símbolo em Ἂ1
vez do ás de espadas 🂡. O que está acontecendo de errado?
Esse problema persiste em vários terminais (urxvt, xterm, cupim) e em todas as fontes que eu tentei (DejaVu, Inconsolata).
Respostas:
help printf
adiaprintf(1)
para as seqüências de escape interpretadas, e os documentos para GNU printf dizem:Algo semelhante é especificado no manual do Bash para cotação ANSI C e
echo
:Em resumo:
\u
não é para 5 dígitos hexadecimais. É\U
:fonte
A resposta de Muru está completamente correta, mas apenas para esclarecer um ponto:
Quando você está imprimindo
\u1F0A1
, isso é interpretado como uma fuga Unicode de dezesseis bits\u1F0A
, seguida pelo caractere literal1
(já que\u
ocupa os quatro caracteres a seguir , nem mais nem menos). U + 1F0A então forneceἊ
um alfa grego com dois diacríticos ( letra maiúscula grega Alpha com Psili e Varia , para ser mais preciso).Se você quiser mais de dezesseis bits na sua fuga Unicode, precisará usar
\U
, o que requer oito caracteres hexadecimais:\U0001F0A1
fornecerá o cartão de jogo.fonte
\U0001F0A1
é realmente mais portátil que\U1F0A1
. É oprintf
utilitário independente GNU que introduziu essas\uXXXX
/\UXXXXXXXX
seqüências e requer 4 dígitos\u
e 8 para\U
. Outrasprintf
implementações como o embutido no shell GNU, ksh93 e zsh são mais relaxadas. Em qualquer caso,printf '\u/\U'
não é POSIX. No entanto, o POSIX especificará zsh$'\U1F0A1'
e não exigirá todos os 8 dígitos.\uxxxx
é até 4 dígitos e\Uxxxxxxxx
é até 8 dígitos. Observe que agora o Unicode está limitado aos pontos de código de 0 a 0x10FFFF (uma limitação trazida por UTF16), portanto, os pontos de código nunca terão mais de 6 dígitos (ainda\U123456789
seriam interpretados como o caractere do ponto de código 0x12345678 seguido9
e falha). A especificação POSIX para$'\u\U'
ainda não está finalizada (consulte austingroupbugs.net/view.php?id=249 ). Em um rascunho anterior, eles exigiam todos os 4/8 dígitos, mas que foram alterados mais tarde (mediante solicitação).