2012-10-29 41 views

Trả lời

7

Điều bạn có thể làm là lặp lại fr om 0 đến 127 và sau đó chuyển đổi giá trị thập phân sang giá trị ASCII (hoặc ngược lại).

Bạn có thể sử dụng these chức năng để làm điều đó:

# POSIX 
# chr() - converts decimal value to its ASCII character representation 
# ord() - converts ASCII character to its decimal value 

chr() { 
    [ ${1} -lt 256 ] || return 1 
    printf \\$(printf '%03o' $1) 
} 

# Another version doing the octal conversion with arithmetic 
# faster as it avoids a subshell 
chr() { 
    [ ${1} -lt 256 ] || return 1 
    printf \\$(($1/64*100+$1%64/8*10+$1%8)) 
} 

# Another version using a temporary variable to avoid subshell. 
# This one requires bash 3.1. 
chr() { 
    local tmp 
    [ ${1} -lt 256 ] || return 1 
    printf -v tmp '%03o' "$1" 
    printf \\"$tmp" 
} 

ord() { 
    LC_CTYPE=C printf '%d' "'$1" 
} 

# hex() - converts ASCII character to a hexadecimal value 
# unhex() - converts a hexadecimal value to an ASCII character 

hex() { 
    LC_CTYPE=C printf '%x' "'$1" 
} 

unhex() { 
    printf \\x"$1" 
} 

# examples: 

chr $(ord A) # -> A 
ord $(chr 65) # -> 65 
+0

Lưu ý rằng 0-31 thường không được coi là "có thể in", ngoại trừ thứ các ký tự khoảng trắng (đường trả về vận chuyển, dòng mới và tab ngang và dọc). – twalberg

3

Đây là cách bạn in một số nguyên như nhân vật ascii tương ứng của nó với awk:

echo "65" | awk '{ printf("%c", $0); }' 

mà sẽ in:

A 

Và đây là cách bạn có thể lặp qua bảng chữ cái viết hoa theo cách này:

# ascii for A starts at 65: 
ascii=65 
index=1 
total=26 
while [[ $total -ge $index ]] 
do 
    letter=$(echo "$ascii" | awk '{ printf("%c", $0); }') 
    echo "The $index'th letter is $letter" 

    # Increment the index counter as well as the ascii counter 
    index=$((index+1)) 
    ascii=$((ascii+1)) 
done 
2

Vâng ... Nếu bạn thực sự muốn họ tất cả, và bạn muốn nó được một cái gì đó kịch bản giống như, bạn có thể làm được điều này, tôi đoán:

awk 'function utf32(i) {printf("%c%c%c%c",i%0x100,i/0x100%0x100,i/0x10000%0x100,i/0x1000000) } BEGIN{for(i=0;i<0x110000;i++){utf32(i);utf32(0xa)}}' | iconv --from-code=utf32 --to-code=utf8 | grep -a '[[:print:]]' 

Nhưng danh sách này khá lớn và không hữu ích lắm. Awk có thể không phải là cách thanh lịch nhất để tạo ra các số nguyên nhị phân từ 0 đến 0x110000 - thay thế một cái gì đó thanh lịch hơn nếu bạn tìm thấy nó.

Chỉnh sửa: Ồ, tôi thấy bạn chỉ muốn ascii. Vâng, tôi sẽ để câu trả lời này ở lại đây trong trường hợp ai đó thực sự muốn tất cả các ký tự in được UTF.

5

Một khả năng sử dụng chỉ echo s trình tự thoát bát phân:

for n in {0..7}{0..7}{0..7}; do echo -ne "\\0$n"; done 
2

Dưới đây là những gì tôi đã đưa ra cho một lớp lót dùng một số mảnh từ sampson-chen và câu trả lời mata của:

for n in {0..127}; do awk '{ printf("%c", $0); }' <<< $n; done 

Hoặc cách khác:

for n in {0..127}; do echo $n; done | awk '{ printf("%c", $0); }' 
Các vấn đề liên quan