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 " "

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 %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

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


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)


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

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/ .


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.