Gostaria de adicionar o crânio e ossos cruzados Unicode ao prompt do meu shell (especificamente os 'CRÂNIO E CROSSBONES' (U + 2620)), mas não consigo descobrir o encantamento mágico para fazer o eco cuspir nele ou em qualquer outro, Caractere Unicode de 4 dígitos. Um de dois dígitos é fácil. Por exemplo, echo -e "\ x55",.
Além das respostas abaixo, observe que, obviamente, seu terminal precisa suportar Unicode para que a saída seja o que você espera. O gnome-terminal faz um bom trabalho nisso, mas não é necessariamente ativado por padrão.
No aplicativo Terminal do macOS, vá para Preferências-> Codificações e escolha Unicode (UTF-8).
bash
shell
unicode
character-encoding
masukomi
fonte
fonte
"\x7F"
um código de idioma UTF-8 (que abash
tag sugere que o seu seja) ... os padrões representados por um único byte nunca estão no intervalo\x80-\xFF
. Esse intervalo é ilegal em caracteres UTF-8 de um byte. por exemplo, um valor de ponto de código Unicode deU+0080
(ie.\x80
) é na verdade 2 bytes em UTF-8 ..\xC2\x80
..printf "\\u007C\\u001C"
.gnome-terminal
,echo -e '\ufc'
não produz um ü, mesmo com a codificação de caracteres definida como UTF-8. No entanto, por exemplourxvt
, imprime , por exemplo,printf "\\ub07C\\ub01C"
conforme o esperado (não com uma caixa ou).bash
tag é uma dica tão útil? Terminais diferentes são comuns em CJK ou…?Respostas:
No UTF-8, são na verdade 6 dígitos (ou 3 bytes).
Para verificar como é codificado pelo console, use hexdump:
fonte
LANG=C
vez deLANG=en_US.UTF-8
. Agora, meus terminais no Gnome mostram os símbolos corretamente ... Os terminais reais (tty1-6) ainda não mostram.0000000 f0 9f 8d ba
traduz para\xf0\x9f\x8d\xba
. Exemplo eco:echo -e "\xf0\x9f\x8d\xba"
.$'...'
sintaxe para obter o caractere codificado em uma variável sem usar um$(...)
subshell captura, para uso em contextos que não eles mesmos interpretar as sequências de escape:skull=$'\xE2\x98\xA0'
0000000 98e2 00a0
. É claro que isso0000000
é apenas um deslocamento sem importância, mas os bytes após a conversão\xe2\x98\xa0
, porque a máquina usa a pequena ordem de bytes endian.Isso funciona no Zsh (verifiquei a versão 4.3) e no Bash 4.2 ou mais recente.
fonte
Desde que seus editores de texto possam lidar com Unicode (presumivelmente codificado em UTF-8), você poderá inserir o ponto de código Unicode diretamente.
Por exemplo, no editor de texto do Vim , você entra no modo de inserção e pressiona Ctrl+ V+ Ue, em seguida, o número do ponto de código como um número hexadecimal de 4 dígitos (teclado com zeros, se necessário). Então você digitaria Ctrl+ V+ U 2 6 2 0. Vejo: Qual é a maneira mais fácil de inserir caracteres Unicode em um documento?
Em um terminal executando o Bash, digite CTRL+ SHIFT+ Ue digite o ponto de código hexadecimal do caractere que você deseja. Durante a entrada, seu cursor deve mostrar um sublinhado
u
. O primeiro dígito que não digita termina a entrada e renderiza o caractere. Assim, você poderá imprimir o U + 2620 no Bash usando o seguinte:echo CTRL+ SHIFT+U2620ENTERENTER
(A primeira entrada finaliza a entrada Unicode e a segunda executa o
echo
comando.)Crédito: Ask Ubuntu SE
fonte
C-S-u 2 6 2 0
é um recurso do emulador de terminal, XIM (X Input Method) ou similar. AFAIK, você não poderá enviar ambosSHIFT
eCTRL
para a camada terminal. O terminal fala apenas em caracteres, em vez de em academias e códigos de chave como o seu servidor X (também é de 7 bits para todos os efeitos). Neste mundo,CTRL
mascara os 4 bits mais significativos (& 0b00001111) que resultam emAqui está uma implementação Bash totalmente interna, sem bifurcação, tamanho ilimitado de caracteres Unicode.
A saída foi:
fonte
Basta colocar "☠" no seu script de shell. No local correto e em um console habilitado para Unicode, ele será impresso bem:
Uma "solução alternativa" feia seria produzir a sequência UTF-8, mas isso também depende da codificação usada:
fonte
Alinhamento rápido para converter caracteres UTF-8 no formato de 3 bytes:
fonte
printf "\\\x%s" $(printf '☠'|xxd -p -c1 -u)
.... o xxd é enviado como parte do pacote '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
... enjoy 👍Eu estou usando isso:
Isso é muito mais fácil do que pesquisar uma representação hexadecimal ... Estou usando isso nos meus scripts de shell. Isso funciona no AFAIK gnome-term e urxvt.
fonte
Pode ser necessário codificar o ponto de código como octal para que a expansão rápida decodifique corretamente.
U + 2620 codificado como UTF-8 é E2 98 A0.
Então, no Bash,
fará com que sua concha avise no crânio e nos ossos.
fonte
No bash para imprimir um caractere Unicode para saída, use \ x, \ u ou \ U (primeiro para hexadecimal de 2 dígitos, segundo para hexadecimal de 4 dígitos, terceiro para qualquer comprimento)
Se você deseja atribuí-lo a uma variável, use a sintaxe $ '...'
fonte
Se você não se importa com uma linha única do Perl:
-CS
permite decodificação UTF-8 na entrada e codificação UTF-8 na saída.-E
avalia o próximo argumento como Perl, com recursos modernos comosay
ativado. Se você não quiser uma nova linha no final, use emprint
vez desay
.fonte
Qualquer um desses três comandos imprimirá o caractere desejado em um console, desde que o console aceite caracteres UTF-8 (os mais atuais):
Depois, você pode copiar e colar o glifo real (imagem, caractere) em qualquer editor de texto (habilitado para UTF-8).
Se você precisar ver como esse ponto de código Unicode é codificado em UTF-8, use xxd (visualizador hexadecimal muito melhor que od):
Ou, no HEX, para evitar erros: 0xE2 0x98 0xA0. Ou seja, os valores entre o espaço (HEX 20) e o Line-Feed (Hex 0A).
Se você deseja aprofundar a conversão de números em caracteres: veja aqui um artigo do wiki de Greg (BashFAQ) sobre a codificação ASCII no Bash!
fonte
O
printf
builtin (assim como o coreutilsprintf
) conhece a\u
sequência de escape que aceita caracteres Unicode de 4 dígitos:Teste com o Bash 4.2.37 (1):
fonte
\printf
a usar o executável autônomo, ou tentar com atualizado festaDesculpe por reviver esta pergunta antiga. Porém, ao usar,
bash
existe uma abordagem muito fácil para criar pontos de código Unicode a partir da entrada ASCII simples, que nem sequer é bifurcada :Use-o da seguinte maneira para definir certos pontos de código
ou despejar os primeiros pontos de código unicode 65536 em stdout (leva menos de 2s na minha máquina. O espaço adicional é para impedir que certos caracteres fluam entre si devido à fonte monoespaçada do shell):
ou para contar uma pequena história muito típica dos pais (isso precisa do Unicode 2010):
Explicação:
printf '\UXXXXXXXX'
imprime qualquer caractere Unicodeprintf '\\U%08x' number
imprime\UXXXXXXXX
com o número convertido em hexadecimal, este é alimentado a outroprintf
para realmente imprimir o caractere Unicodeprintf
reconhece octal (0oct), hex (0xHEX) e decimal (0 ou números começando de 1 a 9) como números, para que você possa escolher a representação que melhor se adequarprintf -v var ..
reúne a saída deprintf
em uma variável, sem fork (que acelera tremendamente as coisas)local variable
existe para não poluir o espaço para nome globallocal -n var=other
aliasesvar
paraother
, de tal forma que a atribuição paravar
alteraother
. Uma parte interessante aqui é quevar
faz parte do espaço para nome local, enquantoother
faz parte do espaço para nome global.local
ouglobal
namespace nobash
. As variáveis são mantidas no ambiente e sempre são globais. Local apenas retira o valor atual e o restaura quando a função é deixada novamente. Outras funções chamadas de dentro da função comlocal
ainda verão o valor "local". Esse é um conceito fundamentalmente diferente de todas as regras de escopo normais encontradas em outras linguagens (e o quebash
faz é muito poderoso, mas pode levar a erros se você for um programador que não está ciente disso).fonte
Aqui está uma lista de todos os emojis unicode disponíveis:
https://en.wikipedia.org/wiki/Emoji#Unicode_blocks
Exemplo:
Para obter o valor ASCII desse caractere, use hexdump
E então use os valores informados em formato hexadecimal
fonte
Com base nas perguntas do Stack Overflow , corte no Unix, remova o primeiro token e https://stackoverflow.com/a/15903654/781312 :
Saída é a seguinte.
fonte
Fácil com um liner Python2 / 3:
Resulta em:
fonte
No Bash:
Resultado:
fonte
Se o valor hexadecimal do caractere unicode for conhecido
Se o valor decimal de um caractere unicode for conhecido
fonte