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