obter valor numérico ASCII para um caractere

10

Eu estou tentando escrever um script de shell que solicita um caractere ASCII no intervalo AZ ou az e retorna seu valor numérico equivalente. Por exemplo, a saída pode ter a seguinte aparência:

scarlet$ Please type a character between A and Z or between a and z:
scarlet$ A       
scarlet$ The decimal value of A is: 65 

Minha tentativa:

#!/bin/bash
echo Enter a letter:
read A
echo -n ${A} | od -i | head -1 | cut -b 10- | tr -d " "
Postagem do Anfitrião
fonte
Editei sua segunda pergunta, pois ela não era relacionada; você deve publicá-lo separadamente (você pode obter o texto original aqui )
Michael Mrozek
Seu exemplo funciona para mim. Você pode colar a saída mostrando o que acontece e descrever qual é o erro? Faz o echo -n Aque você espera? Caso contrário, tente printf. Faz o od -ique você espera? Caso contrário, tente od -t d1.
Mikel
11
Eu tentei od-t d1 funcionou muito bem ... Obrigado
Anfitrião Post

Respostas:

8

POSIX: printf a | od -A n -t d1

Perl: perl -e 'print ord($ARGV[0])' a

Perl, lidando com UTF-8 se estiver em um código de idioma UTF-8: perl -C255 -e 'print ord($ARGV[0])' œ

Gilles 'SO- parar de ser mau'
fonte
8

POSIX:

$ printf %d\\n \'a
97

Também funciona com caracteres não ASCII no bash 4.0 e posterior e no zsh:

$ printf %x\\n \'あ
3042

Você também pode usar recode ..dumppara ver pontos de código hexadecimal:

$ printf aあ|recode ..dump
UCS2   Mne   Description

0061   a     latin small letter a
3042   a5    hiragana letter a
Lri
fonte
2
Para torná-lo um pouco menos "obscuro", pode-se também usar eg A=a ; printf '%d\n' "'$A'"e no ksh algo como A=a; integer N=$(("'$A'")); print $N(print ou printf não é necessário).
Jelmd #
3

Talvez:

#!/bin/bash

echo -n "Enter a letter:"
read A
echo ${A}|od -t d1|awk '{printf "%s",$2}';echo

Felicidades

D4RIO
fonte
Eu usaria apenas o awk, em vez do nawk. Isso é bastante padrão para qualquer versão do awk.
asoundmove
Editado, é o meu hábito de usar 'nawk' desde que eu não tenho awk no trabalho
D4RIO
sim, sua solução funcionou para mim também .. obrigado #
197 Host Anfitrião:
1

Uma solução sem od, apenas bash e minúscula, até agora. zé o caractere pesquisado, aqui scomo pesquisa. i=97porque ascii (a) = 97. O resto é óbvio.

z=s 
i=97
for c in {a..z}
do 
    [ "$c" = "$z" ] && echo $i && break || ((i+=1))
done

Você pode colocá-lo em uma única linha, é claro. Aqui estão alguns ponto e vírgula: ;;;;;(deve ser suficiente)

Usuário desconhecido
fonte
Testei o código acima .. mas não funcionou para mim .. Recebi uma mensagem dizendo "i + = 1" não encontrado!
Host Post
Isso funciona no bash. Você pode precisar de i = $ ((i + 1)).
desconhecido utilizador
Em uma linha e com a leitura de uma tecla do teclado:read char; i=97; for c in {a..z}; do [ "$c" = "$char" ] && echo $i && break || ((i+=1)); done
erik
0

Tente od -t d1se você tiver. Os outros formatos de saída são bastante estranhos.

Você também não precisa de cabeça e corte, por exemplo:

printf "A" | od -t d1 | read addr num && echo $num
Mikel
fonte
0

Se você quer apenas um programa que faça isso e não estiver fazendo isso como exercício, existe um programa chamado asciique faz isso. Sua distribuição já pode oferecê-lo como um pacote, se não obtê-lo em http://www.catb.org/~esr/ascii/ .

bahamat
fonte
0
# Get one character per loop, until the user presses <Enter>
while true ; do 
    read -n 1 c
    (( ${#c} == 0 )) && break # Exit the loop. Input length is 0  
                              # ie. The user has pressed Enter
    #
    if [   \( ! "$c" \< "a" -a  ! "$c" \> "z" \) \
        -o \( ! "$c" \< "A" -a  ! "$c" \> "Z" \) ]
    then
        val=($(ascii -s $c)) # build an array of ascii info for this char 
        echo " ... The decimal value of $c is: ${val[1]}"
    else
        echo -n  $'\r \r' # overwrite the invalid character
    fi 
done
Peter.O
fonte