¿Cómo se hace eco de un carácter Unicode de 4 dígitos en Bash?

Resuelto masukomi asked hace 15 años • 20 respuestas

Me gustaría agregar la calavera y las tibias cruzadas Unicode a mi símbolo del shell (específicamente 'CRÁNEO Y CROSSBONES' (U+2620) ), pero no puedo descifrar el encantamiento mágico para hacer que echo lo escupa, ni ningún otro. Carácter Unicode de 4 dígitos. Los de dos dígitos son fáciles. Por ejemplo, echo -e "\x55", .

Además de las respuestas a continuación, cabe señalar que, obviamente, su terminal debe ser compatible con Unicode para que el resultado sea el esperado. gnome-terminal hace un buen trabajo con esto, pero no necesariamente está activado de forma predeterminada.

En la aplicación Terminal de macOS, vaya a Preferencias-> Codificaciones y elija Unicode (UTF-8).

masukomi avatar Mar 02 '09 23:03 masukomi
Aceptado

En UTF-8, en realidad son 6 dígitos (o 3 bytes).

$ printf '\xE2\x98\xA0'

Para comprobar cómo está codificado por la consola, utilice hexdump:

$ printf ☠ | hexdump
0000000 98e2 00a0                              
0000003
vartec avatar Mar 02 '2009 16:03 vartec
% echo -e '\u2620'     # \u takes four hexadecimal digits
☠
% echo -e '\U0001f602' # \U takes eight hexadecimal digits
😂

Esto funciona en Zsh (he comprobado la versión 4.3) y en Bash 4.2 o posterior.

Juliano avatar Mar 02 '2009 16:03 Juliano

Siempre que sus editores de texto puedan manejar Unicode (presumiblemente codificado en UTF-8), puede ingresar el punto de código Unicode directamente.

Por ejemplo, en el editor de texto Vim , ingresaría al modo de inserción y presionaría Ctrl+ V+ Uy luego el número de punto de código como un número hexadecimal de 4 dígitos (rellene con ceros si es necesario). Entonces escribirías Ctrl+ V+ U 2 6 2 0. Consulte: ¿Cuál es la forma más sencilla de insertar caracteres Unicode en un documento?

En una terminal que ejecute Bash, escribiría CTRL++ y escribiría el punto SHIFTde Ucódigo hexadecimal del carácter que desea. Durante la entrada, el cursor debe mostrar un subrayado u. El primer dígito que escriba finaliza la entrada y representa el carácter. Entonces podrías imprimir U+2620 en Bash usando lo siguiente:

echo CTRL+ SHIFT+U2620ENTERENTER

(La primera entrada finaliza la entrada Unicode y la segunda ejecuta el echocomando).

Crédito: Pregúntale a Ubuntu SE

RobM avatar May 10 '2011 19:05 RobM

Aquí hay una implementación de Bash completamente interna, sin bifurcaciones y tamaño ilimitado de caracteres Unicode.

fast_chr() {
    local __octal
    local __char
    printf -v __octal '%03o' $1
    printf -v __char \\$__octal
    REPLY=$__char
}

function unichr {
    local c=$1    # Ordinal of char
    local l=0    # Byte ctr
    local o=63    # Ceiling
    local p=128    # Accum. bits
    local s=''    # Output string

    (( c < 0x80 )) && { fast_chr "$c"; echo -n "$REPLY"; return; }

    while (( c > o )); do
        fast_chr $(( t = 0x80 | c & 0x3f ))
        s="$REPLY$s"
        (( c >>= 6, l++, p += o+1, o>>=1 ))
    done

    fast_chr $(( t = p | c ))
    echo -n "$REPLY$s"
}

## test harness
for (( i=0x2500; i<0x2600; i++ )); do
    unichr $i
done

La salida fue:

─━│┃┄┅┆┇┈┉┊┋┌┍┎┏
┐┑┒┓└┕┖┗┘┙┚┛├┝┞┟
┠┡┢┣┤┥┦┧┨┩┪┫┬┭┮┯
┰┱┲┳┴┵┶┷┸┹┺┻┼┽┾┿
╀╁╂╃╄╅╆╇╈╉╊╋╌╍╎╏
═║╒╓╔╕╖╗╘╙╚╛╜╝╞╟
╠╡╢╣╤╥╦╧╨╩╪╫╬╭╮╯
╰╱╲╳╴╵╶╷╸╹╺╻╼╽╾╿
▀▁▂▃▄▅▆▇█▉▊▋▌▍▎▏
▐░▒▓▔▕▖▗▘▙▚▛▜▝▞▟
■□▢▣▤▥▦▧▨▩▪▫▬▭▮▯
▰▱▲△▴▵▶▷▸▹►▻▼▽▾▿
◀◁◂◃◄◅◆◇◈◉◊○◌◍◎●
◐◑◒◓◔◕◖◗◘◙◚◛◜◝◞◟
◠◡◢◣◤◥◦◧◨◩◪◫◬◭◮◯
◰◱◲◳◴◵◶◷◸◹◺◻◼◽◾◿
Orwellophile avatar May 12 '2013 16:05 Orwellophile

Una línea rápida para convertir caracteres UTF-8 a su formato de 3 bytes:

var="$(echo -n '☠' | od -An -tx1)"; printf '\\x%s' ${var^^}; echo

o

echo -n '☠' | od -An -tx1 | sed 's/ /\\x/g'  

El resultado de ambos es \xE2\x98\xA0, por lo que puedes escribir al revés:

echo $'\xe2\x98\xa0'   # ☠
xerostomus avatar Apr 22 '2011 21:04 xerostomus