Na tabela ASCII, existe o caractere 'J' que possui pontos de código em diferentes sistemas numéricos:
Oct Dec Hex Char
112 74 4A J
É possível imprimir esse caractere por um ponto de código octal, imprimindo
printf '\112'
ou echo $'\112'
. Como imprimo o mesmo caractere em apresentações de ponto de código decimal e hexadecimal?
Respostas:
Hex:
Dez:
Alternativa para hex :-)
fonte
awk
.Com
zsh
:Para obter um caractere (no conjunto de caracteres atual) do ponto de código Unicode:
fonte
Em geral, o shell pode entender números hex, oct e decimais em variáveis, desde que tenham sido definidos como
integers
:Ou são o resultado de uma "Expansão Aritmética":
Portanto, você só precisa de uma maneira de imprimir o caractere que pertence a um valor variável.
Mas aqui estão duas maneiras possíveis:
Os dois printf são necessários, um para transformar o valor em uma sequência hexadecimal e o segundo para realmente imprimir o caractere.
O segundo imprimirá qualquer ponto UNICODE (se o console estiver configurado corretamente).
Por exemplo:
Um homem da neve.
O caractere que possui uma representação utf-8 como
f0 9f 90 ae
está0x1F42E
. Procurarcow face site:fileformat.info
para obtê-lo :Nota : Há um problema com a maneira UNICODE no bash anterior a 4.3 (corrigido nessa versão e acima), os caracteres entre os pontos 128 e 255 do UNICODE (em decimal) podem ser impressos incorretamente.
Referências
Quarto parágrafo dentro
PARAMETERS
deman bash
:Dentro de "AVALIAÇÃO ARITMÉTICA" em
man bash
:fonte
é
(Octal: 351, Dec: 233, Hex: 0xE9) é impresso incorretamente comprintf '\351'
, pois imprime um valor de byte de0xE9
sempre. Para um terminal com uma codificação deISO-8859-1
(e primos) que pode funcionar, mas em terminais codificados utf-8, um valor de byte0xE9
deve aparecer como . cont ...\u
(que vem do zsh).Decimal:
Hex:
A função pode fazer sequências:
fonte
Você pode usar a biblioteca stdlib do POSIX Awk :
fonte
Se você possui uma lista de números para converter e deseja evitar uma chamada de função e criar um subshell para cada caractere, é possível definir o conjunto de ascii previamente:
Observe que char nulo é excluído, portanto, cada char é compensado por 1.
Em seguida, use algo como isto (assume 1 número por linha):
fonte
Aqui estão todas as conversões usando
printf
:fonte