dapatkan nilai ASCII numerik untuk sebuah karakter

10

Saya mencoba menulis skrip shell yang meminta karakter ASCII dalam rentang AZ atau az dan mengembalikan nilai numerik yang setara. Sebagai contoh, output mungkin terlihat seperti berikut:

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

Usaha saya:

#!/bin/bash
echo Enter a letter:
read A
echo -n ${A} | od -i | head -1 | cut -b 10- | tr -d " "
Host Post
sumber
Saya mengedit pertanyaan kedua Anda karena tidak ada hubungannya; Anda harus mempostingnya secara terpisah (Anda bisa mendapatkan teks aslinya di sini )
Michael Mrozek
Teladan Anda bermanfaat bagi saya. Bisakah Anda menempelkan output yang menunjukkan apa yang terjadi dan menjelaskan apa kesalahannya? Apakah echo -n Amelakukan apa yang Anda harapkan? Jika tidak, coba printfsaja. Apakah od -imelakukan apa yang Anda harapkan? Jika tidak, coba od -t d1.
Mikel
1
Saya mencoba od-t d1 bekerja dengan baik ... Terima kasih
Host Post

Jawaban:

8

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

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

Perl, mengatasi UTF-8 jika di lokal UTF-8: perl -C255 -e 'print ord($ARGV[0])' œ

Gilles 'SANGAT berhenti menjadi jahat'
sumber
8

POSIX:

$ printf %d\\n \'a
97

Ini juga berfungsi dengan karakter non-ASCII di bash 4.0 dan yang lebih baru dan di zsh:

$ printf %x\\n \'あ
3042

Anda juga dapat menggunakan recode ..dumpuntuk melihat poin kode heksadesimal:

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

0061   a     latin small letter a
3042   a5    hiragana letter a
Lri
sumber
2
Untuk membuatnya sedikit "kurang jelas", kita juga dapat menggunakan mis A=a ; printf '%d\n' "'$A'"dan pada ksh sesuatu seperti A=a; integer N=$(("'$A'")); print $N(cetak atau printf tidak diperlukan).
jelmd
3

Mungkin:

#!/bin/bash

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

Bersulang

D4RIO
sumber
Saya hanya akan menggunakan awk, daripada nawk. Ini cukup standar untuk versi awk apa pun.
asoundmove
Diedit, adalah kebiasaan saya menggunakan 'nawk' karena saya tidak awk di tempat kerja
D4RIO
ya, solusi Anda juga berhasil untuk saya .. terima kasih
Host Post
1

Solusi yang kurang baik, hanya bash, dan hanya huruf kecil, sejauh ini. zadalah karakter yang dicari, di sini ssebagai pencarian. i=97karena ascii (a) = 97. Sisanya jelas.

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

Anda bisa memasukkannya ke dalam satu baris saja. Berikut adalah beberapa semikolon: ;;;;;(harus cukup)

Pengguna tidak diketahui
sumber
Saya menguji kode di atas .. tetapi tidak berhasil untuk saya .. Saya mendapat pesan yang mengatakan "i + = 1" tidak ditemukan!
Host Post
Ini bekerja di bash. Anda mungkin membutuhkan i = $ ((i +1)) sebagai gantinya.
pengguna tidak dikenal
Dalam satu baris dan dengan membaca kunci dari keyboard:read char; i=97; for c in {a..z}; do [ "$c" = "$char" ] && echo $i && break || ((i+=1)); done
erik
0

Coba od -t d1jika Anda memilikinya. Format output lainnya cukup aneh.

Anda juga tidak perlu kepala dan potong, misalnya:

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

Jika Anda hanya ingin program yang melakukan ini dan Anda tidak melakukan ini sebagai latihan, maka ada program yang disebut asciiyang melakukan ini. Distro Anda mungkin sudah menawarkannya sebagai paket, jika tidak mendapatkannya dari http://www.catb.org/~esr/ascii/ .

bahamat
sumber
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
sumber