Estoy ejecutando Arch Linux con terminal simple usando la fuente Adobe Source Code Pro. Mi configuración regional está configurada correctamente LANG=en_US.UTF-8
.
Quiero imprimir caracteres Unicode que representan naipes en mi terminal. Estoy usando Wikipedia como referencia .
Los caracteres Unicode para trajes de cartas funcionan bien. Por ejemplo, emitiendo
$ printf "\u2660"
imprime un corazón negro en la pantalla.
Sin embargo, estoy teniendo problemas con cartas específicas. Emisor
$ printf "\u1F0A1"
imprime el símbolo en Ἂ1
lugar del as de espadas 🂡. Que va mal
Este problema persiste en varios terminales (urxvt, xterm, termite) y en todas las fuentes que he probado (DejaVu, Inconsolata).
Respuestas:
help printf
difiereprintf(1)
para las secuencias de escape interpretadas, y los documentos para GNU printf dicen:Algo similar se especifica en el manual Bash para ANSI C Quoting y
echo
:En resumen:
\u
no es para 5 dígitos hexadecimales. Es\U
:fuente
La respuesta de Muru es completamente correcta, pero solo para aclarar un punto:
Cuando imprime
\u1F0A1
, se interpreta como un escape Unicode de dieciséis bits\u1F0A
, seguido del carácter literal1
(ya que\u
toma los siguientes cuatro caracteres, ni más, ni menos). U + 1F0A a continuación, daἊ
, una alfa griega con un par de diacríticos en él ( griego Mayúscula alfa con Psili y Varia , para ser exactos).Si quieres más de dieciséis bits en tu escape de Unicode, debes usarlo
\U
, que requiere un hexadecimal de ocho caracteres:\U0001F0A1
te dará la carta de juego.fuente
\U0001F0A1
en realidad es más portátil que\U1F0A1
. Es laprintf
utilidad independiente de GNU que introdujo esas\uXXXX
/\UXXXXXXXX
secuencias por primera vez y requiere 4 dígitos para\u
y 8 para\U
. Otrasprintf
implementaciones como la construcción del shell GNU, ksh93 y zsh son más laxas. En cualquier casoprintf '\u/\U'
no es POSIX. Sin embargo, POSIX especificará zsh$'\U1F0A1'
y no requerirá los 8 dígitos.\uxxxx
tiene hasta 4 dígitos y\Uxxxxxxxx
tiene hasta 8 dígitos. Tenga en cuenta que Unicode ahora está limitado a los puntos de código 0 a 0x10FFFF (una limitación traída por UTF16), por lo que los puntos de código nunca tendrán más de 6 dígitos (aún\U123456789
se interpretarían como el carácter del punto de código 0x12345678 seguido de9
y fallará). La especificación POSIX para$'\u\U'
todavía no está finalizada (ver austingroupbugs.net/view.php?id=249 ). En un borrador anterior, requerían todos los dígitos de 4/8 pero eso cambió más tarde (a petición mía).