Me gustaría agregar el cráneo y las tibias cruzadas de Unicode a mi indicador de shell (específicamente el 'CRÁNEO Y CRUZES' (U + 2620)), pero no puedo entender el encantamiento mágico para hacer que el eco lo escupe, o cualquier 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, debe tenerse en cuenta que, obviamente, su terminal debe ser compatible con Unicode para que la salida sea lo que espera. gnome-terminal hace un buen trabajo, pero no está necesariamente activado de manera predeterminada.
En la aplicación Terminal de macOS Vaya a Preferencias-> Codificaciones y elija Unicode (UTF-8).
bash
shell
unicode
character-encoding
masukomi
fuente
fuente
"\x7F"
en un entorno local UTF-8 (que labash
etiqueta sugiere que es el suyo) ... los patrones representados por un solo byte nunca están en el rango\x80-\xFF
. Este rango es ilegal en caracteres UTF-8 de byte único. por ejemplo, un valor de punto de código Unicode deU+0080
(es decir\x80
) es en realidad 2 bytes en UTF-8 ..\xC2\x80
..printf "\\u007C\\u001C"
.gnome-terminal
,echo -e '\ufc'
no produce una ü, incluso con la codificación de caracteres establecida en UTF-8. Sin embargo, por ejemplourxvt
, se imprime , por ejemplo,printf "\\ub07C\\ub01C"
como se esperaba (no con un o cuadro).bash
etiqueta es una pista tan útil? ¿Son comunes los diferentes terminales en CJK o ...?Respuestas:
En UTF-8 en realidad son 6 dígitos (o 3 bytes).
Para verificar cómo está codificada por la consola, use hexdump:
fuente
LANG=C
lugar deLANG=en_US.UTF-8
. Ahora mis terminales en Gnome muestran los símbolos correctamente ... Los terminales reales (tty1-6) todavía no lo hacen.0000000 f0 9f 8d ba
traduce en\xf0\x9f\x8d\xba
. Ejemplo eco:echo -e "\xf0\x9f\x8d\xba"
.$'...'
sintaxis para obtener el carácter codificado en a una variable sin utilizar un$(...)
subnivel de captura, para su uso en contextos que por sí mismas no interpretan las secuencias de escape:skull=$'\xE2\x98\xA0'
0000000 98e2 00a0
. Por supuesto, el0000000
es solo un desplazamiento sin importancia, pero los bytes después de que se traducen\xe2\x98\xa0
, porque la máquina usa el orden de los pequeños bytes endian.Esto funciona en Zsh (he comprobado la versión 4.3) y en Bash 4.2 o posterior.
fuente
Mientras sus editores de texto puedan hacer frente a Unicode (presumiblemente codificado en UTF-8), puede ingresar el punto de código Unicode directamente.
Por ejemplo, en el editor de texto de Vim ingresarías al modo de inserción y presionarías Ctrl+ V+U y luego el número de punto de código como un número hexadecimal de 4 dígitos (almohadilla con ceros si es necesario). Entonces escribirías Ctrl+ V+ U 2 6 2 0. Ver: ¿Cuál es la forma más fácil de insertar caracteres Unicode en un documento?
En una terminal que ejecuta Bash, escribiría CTRL + SHIFT+ Uy escribiría el punto de código hexadecimal del carácter que desea. Durante la entrada, el cursor debe mostrar un subrayado
u
. El primer no dígito que escriba finaliza la entrada y representa el carácter. Entonces podría 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úntele a Ubuntu SE
fuente
C-S-u 2 6 2 0
es una característica de su emulador de terminal, Método de entrada X (XIM) o similar. AFAIK, no podrá enviar ambosSHIFT
yCTRL
a la capa terminal. El terminal solo habla en caracteres, en lugar de en keyyms y códigos de teclas como su servidor X (también, es de 7 bits para todos los efectos). En este mundo,CTRL
enmascara los 4 bits más significativos (& 0b00001111) que resultan enAquí hay una implementación de Bash completamente interna, sin bifurcación, tamaño ilimitado de caracteres Unicode.
La salida fue:
fuente
Simplemente ponga "☠" en su script de shell. En la configuración regional correcta y en una consola habilitada para Unicode, se imprimirá bien:
Una "solución" fea sería la salida de la secuencia UTF-8, pero eso también depende de la codificación utilizada:
fuente
One-liner rápido para convertir caracteres UTF-8 a su formato de 3 bytes:
fuente
printf "\\\x%s" $(printf '☠'|xxd -p -c1 -u)
... xxd se envía como parte del paquete 'vim-common'hexFromGlyph(){ if [ "$1" == "-n" ]; then outputSeparator=' '; shift; else outputSeparator='\n'; fi for glyph in "$@"; do printf "\\\x%s" $(printf "$glyph"|xxd -p -c1 -u); echo -n -e "$outputSeparator"; done } # usage: $ hexFromGlyph ☠ ✿ \xE2\x98\xA0 \xE2\x9C\xBF $ hexFromGlyph -n ☠ ✿ \xE2\x98\xA0 \xE2\x9C\xBF
codepoints () { printf 'U+%04x\n' ${@/#/\'} ; } ; codepoints A R ☯ 🕉 z
... disfruta 👍Estoy usando esto:
Esto es bastante más fácil que buscar una representación hexadecimal ... Estoy usando esto en mis scripts de shell. Eso funciona en gnome-term y urxvt AFAIK.
fuente
Es posible que deba codificar el punto de código como octal para que la rápida expansión lo decodifique correctamente.
U + 2620 codificado como UTF-8 es E2 98 A0.
Entonces en Bash,
hará que su caparazón se convierta en calavera y huesos.
fuente
En bash para imprimir un carácter Unicode a la salida, use \ x, \ u o \ U (primero para el hex de 2 dígitos, segundo para el hex de 4 dígitos, tercero para cualquier longitud)
Si desea asignarlo a una variable, use la sintaxis $ '...'
fuente
Si no te importa una línea Perl:
-CS
habilita la decodificación UTF-8 en la entrada y la codificación UTF-8 en la salida.-E
evalúa el siguiente argumento como Perl, con características modernas comosay
habilitado. Si no desea una nueva línea al final, use enprint
lugar desay
.fuente
Cualquiera de estos tres comandos imprimirá el carácter que desee en una consola, siempre que la consola acepte caracteres UTF-8 (la mayoría de los actuales):
Después, puede copiar y pegar el glifo real (imagen, carácter) en cualquier editor de texto (habilitado para UTF-8).
Si necesita ver cómo se codifica dicho punto de código Unicode en UTF-8, use xxd (visor hexadecimal mucho mejor que od):
O, en HEX para evitar errores: 0xE2 0x98 0xA0. Es decir, los valores entre el espacio (HEX 20) y el avance de línea (Hex 0A).
Si desea una inmersión profunda en la conversión de números a caracteres: ¡ mire aquí para ver un artículo del wiki de Greg (BashFAQ) sobre la codificación ASCII en Bash!
fuente
El
printf
incorporado (al igual que el coreutils 'printf
) conoce la\u
secuencia de escape que acepta caracteres Unicode de 4 dígitos:Prueba con Bash 4.2.37 (1):
fuente
\printf
usar el ejecutable independiente, o intente con bash actualizadoPerdón por revivir esta vieja pregunta. Pero cuando se usa
bash
hay un enfoque muy fácil para crear puntos de código Unicode a partir de una entrada ASCII simple, que incluso no se bifurca en absoluto:Úselo de la siguiente manera para definir ciertos puntos de código
o para volcar los primeros 65536 puntos de código unicode en stdout (toma menos de 2 segundos en mi máquina. El espacio adicional es para evitar que ciertos caracteres fluyan entre sí debido a la fuente monoespacio de shell):
o para contar una pequeña historia de padres muy típica (esto necesita Unicode 2010):
Explicación:
printf '\UXXXXXXXX'
imprime cualquier carácter Unicodeprintf '\\U%08x' number
imprime\UXXXXXXXX
con el número convertido a hexadecimal, este luego se alimenta a otroprintf
para imprimir realmente el carácter Unicodeprintf
reconoce octal (0oct), hexadecimal (0xHEX) y decimal (0 o números que comienzan con 1 a 9) como números, para que pueda elegir la representación que mejor se ajusteprintf -v var ..
reúne la salida deprintf
en una variable, sin tenedor (que acelera enormemente las cosas)local variable
está ahí para no contaminar el espacio de nombres globallocal -n var=other
aliasvar
aother
, de modo que la asignación avar
alteraother
. Una parte interesante aquí es quevar
es parte del espacio de nombres local, mientras queother
es parte del espacio de nombres global.local
oglobal
espacio de nombres enbash
. Las variables se mantienen en el entorno, y siempre son globales. Local simplemente guarda el valor actual y lo restaura cuando la función se deja de nuevo. Otras funciones llamadas desde dentro de la funciónlocal
aún verán el valor "local". Este es un concepto fundamentalmente diferente de todas las reglas de alcance normales que se encuentran en otros lenguajes (y lo quebash
hace es muy poderoso, pero puede generar errores si usted es un programador que no es consciente de eso).fuente
Aquí hay una lista de todos los emoji unicode disponibles:
https://en.wikipedia.org/wiki/Emoji#Unicode_blocks
Ejemplo:
Para obtener el valor ASCII de este personaje, use hexdump
Y luego use los valores informados en formato hexadecimal
fuente
Según las preguntas de desbordamiento de pila , corte Unix, elimine el primer token y https://stackoverflow.com/a/15903654/781312 :
La salida es la siguiente.
fuente
Fácil con una línea única Python2 / 3:
Resultados en:
fuente
En Bash:
Salida:
fuente
Si se conoce el valor hexadecimal del carácter unicode
Si se conoce el valor decimal de un carácter unicode
fuente