Como você repetir um caractere Unicode de 4 dígitos em Bash?

votos
163

Eu gostaria de adicionar a caveira e ossos cruzados a minha janela de comandos (especificamente a 'caveira e ossos cruzados' (U + 2620)) Unicode, mas eu não consigo descobrir o encantamento mágico para fazer espeto eco-lo, ou qualquer outro, 4 dígitos de caracteres Unicode. Dois dígitos one são fáceis. Por exemplo, echo -e \ x55,.

Além das respostas abaixo deve-se notar que, obviamente, o seu terminal precisa suportar Unicode para a saída para ser o que você espera. gnome-terminal faz um bom trabalho a isso, mas não é necessariamente ligado por padrão. Ir para Terminal-> Definir codificação de caracteres e escolha Unicode (UTF-8).

Publicado 02/03/2009 em 17:12
fonte usuário
Em outras línguas...                            


17 respostas

votos
179

Em UTF-8 é, na verdade, 6 dígitos (ou 3 bytes).

$ printf '\xE2\x98\xA0'

Para verificar como é codificada pelo console, use hexdump:

$ printf ☠ | hexdump
0000000 98e2 00a0                              
0000003
Respondeu 02/03/2009 em 17:16
fonte usuário

votos
63

Enquanto seu texto-editores podem lidar com Unicode (presumivelmente codificados em UTF-8) você pode digitar o código de ponto-Unicode diretamente.

Por exemplo, no Vim editor de texto que você entrar no modo de inserção e pressione Ctrl+ V+ Ue depois o número ponto de código como um número hexadecimal de 4 dígitos (pad com zeros se necessário). Então você deve digitar Ctrl+ V+ U 2 6 2 0. Veja: O que é a maneira mais fácil de inserir caracteres Unicode em um documento?

Em um Bash executando o Terminal você deverá digitar CTRL+ SHIFT+ Ue digite o código de ponto-hexadecimal do caractere desejado. Durante a entrada o cursor deve mostrar um sublinhado u. O primeiro não dígitos que você digita termina entrada, e torna o personagem. Assim, você poderá ser capaz de imprimir U + 2620 em Bash usando o seguinte:

echo CTRL+ SHIFT+U2620ENTERENTER

(O primeiro introduzir termina entrada Unicode, e o segundo é executado o echocomando.)

Crédito: Pergunte Ubuntu SE

Respondeu 10/05/2011 em 20:45
fonte usuário

votos
59
% echo -e '\u2620'

Isso funciona em Zsh (Eu verifiquei versão 4.3) e, em Bash 4.2 ou mais recente.

Respondeu 02/03/2009 em 17:29
fonte usuário

votos
30

Aqui está uma implementação Bash totalmente interno, não bifurcação, tamanho 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

A produção foi:

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

votos
12

Basta colocar "☠" em seu script shell. Na localidade correta e em um console Unicode que vai imprimir muito bem:

$ echo ☠
$

Uma "solução" feio seria a de saída a sequência UTF-8, mas que também depende da codificação utilizada:

$ echo -e '\xE2\x98\xA0'
$
Respondeu 02/03/2009 em 17:16
fonte usuário

votos
10

one-liner rápido para converter caracteres UTF-8 em seu formato 3-byte:

var="$(echo -n '☠' | od -An -tx1)"; printf '\\x%s' ${var^^}; echo
Respondeu 22/04/2011 em 22:48
fonte usuário

votos
7

Estou usando este:

$ echo -e '\u2620'

Isso é muito mais fácil do que procurar uma representação hex ... Eu estou usando isso em meus scripts shell. Que funciona em gnome-prazo e urxvt AFAIK.

Respondeu 01/12/2013 em 09:55
fonte usuário

votos
7

Pode ser necessário para codificar o ponto de código como octal, a fim de prompt de expansão para decodificá-lo corretamente.

L + 2620 codificado como UTF-8 é E2 98 A0.

Assim, em Bash,

export PS1="\342\230\240"

vai fazer a sua janela de comandos no crânio e ossos.

Respondeu 09/04/2013 em 14:45
fonte usuário

votos
3

Se você não se importa um one-liner Perl:

$ perl -CS -E 'say "\x{2620}"'

-CSpermite UTF-8 descodificação na codificação de entrada e UTF-8 na saída. -Eavalia o próximo argumento como Perl, com características modernas como sayhabilitado. Se você não quer uma nova linha no final, use printem vez de say.

Respondeu 17/10/2016 em 16:23
fonte usuário

votos
3

O printfembutido (tal como os coreutils' printf) conhece a \usequência de escape que aceita 4 dígitos caracteres Unicode:

   \uHHHH Unicode (ISO/IEC 10646) character with hex value HHHH (4 digits)

Teste com Bash 4.2.37 (1):

$ printf '\u2620\n'
Respondeu 18/04/2015 em 23:32
fonte usuário

votos
3

Qualquer um desses três comandos imprimirá o caractere que você quer em um console, desde que a consola não aceitamos UTF-8 caracteres (a maioria dos atuais fazem):

echo -e "SKULL AND CROSSBONES (U+2620) \U02620"
echo $'SKULL AND CROSSBONES (U+2620) \U02620'
printf "%b" "SKULL AND CROSSBONES (U+2620) \U02620\n"

SKULL AND CROSSBONES (U+2620) ☠

Depois, você pode copiar e colar o glifo real (imagem, caráter) a qualquer (habilitado UTF-8) editor de texto.

Se você precisa ver como tais Unicode Code Point é codificado em UTF-8, use xxd (muito melhor visualizador de hex do que od):

echo $'(U+2620) \U02620' | xxd
0000000: 2855 2b32 3632 3029 20e2 98a0 0a         (U+2620) ....

That means that the UTF8 encoding is: e2 98 a0

Ou, em HEX para evitar erros: 0xE2 0x98 0xA0. Ou seja, os valores entre o espaço (HEX 20) ea Linha-Feed (Hex 0A).

Se você quiser um mergulho profundo na conversão de números de caracteres: olha aqui !

Respondeu 18/02/2015 em 04:44
fonte usuário

votos
2

Em festa para imprimir um caracter Unicode a utilização de saída \ x, \ u ou \ L (primeiro durante 2 hex dígitos, segundo para hex quatro dígitos, em terceiro lugar para qualquer comprimento)

echo -e '\U1f602'

I você quer associar a um uso variável $ '...' sintaxe

x=$'\U1f602'
echo $x
Respondeu 08/06/2018 em 15:05
fonte usuário

votos
2

Baseado em Stack Overflow questiona Unix corte, retire primeiro token e https://stackoverflow.com/a/15903654/781312 :

(octal=$(echo -n ☠ | od -t o1 | head -1 | cut -d' ' -f2- | sed -e 's#\([0-9]\+\) *#\\0\1#g')
echo Octal representation is following $octal
echo -e "$octal")

A saída é o seguinte.

Octal representation is following \0342\0230\0240
Respondeu 02/05/2014 em 21:01
fonte usuário

votos
1

Desculpe para reviver essa questão de idade. Mas quando se usa bashhá uma abordagem muito fácil criar codepoints Unicode de entrada ASCII, que ainda não bifurcar em tudo:

unicode() { local -n a="$1"; local c; printf -vc '\\U%08x' "$2"; printf -va "$c"; }
unicodes() { local a c; for a; do printf -vc '\\U%08x' "$a"; printf "$c"; done; };

Use-o como segue para definir certos codepoints

unicode crossbones 0x2620
echo "$crossbones"

ou para despejar os primeiros 65536 codepoints unicode para stdout (leva menos de 2s na minha máquina O espaço adicional é evitar que determinados caracteres a fluir para o outro devido a fonte monoespaçada do shell.):

for a in {0..65535}; do unicodes "$a"; printf ' '; done

ou para contar a história um pouco dos pais muito típico (isto precisa Unicode 2010):

unicodes 0x1F6BC 32 43 32 0x1F62D 32 32 43 32 0x1F37C 32 61 32 0x263A 32 32 43 32 0x1F4A9 10

Explicação:

  • printf '\UXXXXXXXX' imprime qualquer caractere Unicode
  • printf '\\U%08x' numberimpressões \UXXXXXXXXcom o número convertido para Hex, este então é alimentado para outro printfpara realmente imprimir o caráter Unicode
  • printf reconhece octal (0oct), hex (0xHEX) e decimal (0 ou números começando com 1 a 9) como números, para que possa escolher o que melhor se encaixa representação
  • printf -v var ..reúne a saída printfem uma variável, sem garfo (que acelera tremendamente coisas)
  • local variable está lá para não poluir o namespace global
  • local -n var=otheraliases varpara other, de tal forma que a atribuição a varaltera other. Uma parte interessante aqui é, que varfaz parte do namespace local, enquanto que otherfaz parte do namespace global.
    • Por favor, note que não há tal coisa como localou globalnamespace no bash. Variáveis são mantidos no ambiente, e tais são sempre global. Local apenas coloca longe o valor atual e restaura-lo quando a função é novamente à esquerda. Outras funções chamadas de dentro da função com localainda verá o valor "local". Este é um conceito fundamentalmente diferente do que todas as regras de escopo normais encontradas em outros idiomas (eo que bashfaz é muito poderoso, mas pode levar a erros se você é um programador que não tem conhecimento de que).
Respondeu 17/03/2018 em 10:04
fonte usuário

votos
1

Fácil via Python:

$ python -c 'print u"\u2620"'

Resulta em:

Respondeu 26/10/2017 em 19:49
fonte usuário

votos
0

Aqui está uma lista de todos os unicode emoji da disponíveis:

https://en.wikipedia.org/wiki/Emoji#Unicode_blocks

Exemplo:

echo -e "\U1F304"
🌄

Para obter o valor ASCII deste uso hexdump caráter

echo -e "🌄" | hexdump -C

00000000  f0 9f 8c 84 0a                                    |.....|
00000005

E, em seguida, usar os valores informados em formato hexadecimal

echo -e "\xF0\x9F\x8C\x84\x0A"
🌄
Respondeu 11/04/2019 em 18:49
fonte usuário

votos
0

Se o valor hexadecimal de caracteres Unicode é conhecido

H="2620"
printf "%b" "\u$H"

Se o valor decimal de um caractere Unicode é conhecido

declare -i U=2*4096+6*256+2*16
printf -vH "%x" $U              # convert to hex
printf "%b" "\u$H"
Respondeu 20/07/2017 em 11:26
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more