2011-11-28 42 views
2

擴展的ASCII字符我寫了一個小的C程序打印的擴展ASCII字符對應於重視129bash的不顯示上述126

#include<stdio.h> 
int main(void) 
{ 
    char a = 129; 
    printf("%c\n",a); 
    return(0); 
} 

編譯和我的UNIX機器(fedora的16)上的bash終端上運行它。 它給出錯誤的顯示。它顯示了一個帶有白色橢圓形背景的問號。

事實上,如果我把一個= 126以上的東西,它會顯示相同的問號。

爲什麼這樣以及如何糾正它?

回答

6

首先,我懷疑這是bash的故障; bash只是找到你的程序並運行它,而實際顯示你程序的輸出是你終端應用程序的工作。其次,沒有超過127的ASCII字符。嘗試打印128..255範圍內的字符會發出一個給定值的字節,但是如何顯示該字節取決於您的終端以及它如何配置。很可能,您的終端預計所有程序輸出都將以UTF-8編碼;爲了向後兼容ASCII,所有小於128的字節都是UTF-8中的有效字符,但是當涉及字節128和以上時,只有某些序列有效,並且具有其高位設置的獨立字節是錯誤的。嘗試從單個程序中按順序打印字節226,152和131;如果你看到一個雪人,你就會知道你的終端正在使用UTF-8。

+0

不,它不顯示任何雪人..與白色背景相同的舊白色問號...任何其他想法? – KawaiKx

+0

@Saurabh:你有沒有用中間的換行符打印字節,就像在你的例子中那樣?三個字節需要一個接一個地打印,其間沒有任何其他字節;因此,在三個字節之後應該只有一個換行符。 – jwodder

+0

明白了..現在它打印出一個雪人。那麼現在的要點是什麼?我的終端配置爲希望所有程序輸出都以UTF-8編碼,這是一種現代化的方案......我如何進一步瞭解它以及它的用法? – KawaiKx

3

爲什麼你認爲有超過127的ASCII字符?

http://en.wikipedia.org/wiki/ASCII

ASCII基本上是7位,0-127

+0

點接受的。現在的問題是有關擴展ASCII ..請你告訴我,爲什麼不bash的顯示擴展ASCII字符? – KawaiKx

+1

@Saurabh:「[Extended ASCII](http://en.wikipedia.org/wiki/Extended_ASCII)」不是單一編碼,通常指[CP437](http://en.wikipedia.org/wiki/Code_page_437),現代UNIX系統在默認情況下不會使用。在現代,大多數非ASCII文本預計採用UTF-8,這是一種完全不同的編碼,其中127以上的單字節無效。 – jwodder

1

我寫了一個bash腳本來顯示ascii 0-127 +擴展128-255。 它取決於系統代碼頁,終端/控制檯等。

字符0 - 31,127顯示來自非printables表的代碼。 所有其他都是原始字符打印到屏幕上。

#!/bin/sh 
# 
# asciie 
# 
# print the extended ascii table per the codepage of the current computer 
# 

# cls 
echo -e \\033c 

# headings for each column 
echo -n "DEC HEX CHR" 
printf " | DEC HEX CHR%.0s" {1..7} 
printf "\n" 

# div 
echo -n "- - - - - - " 
printf "| - - - - - - %.0s" {1..7} 
printf "\n" 


# begin character table for ascii 0 to 127 characters 
tb=('NUL' 'SOH' 'STX' 'ETX' 'EOT' 'ENQ' 'ACK' 'BEL' 'BS ' 'HT ' 'LF ' 'VT ' 'FF ' 'CR ' 'SO ' 'SI ' \ 
'DLE' 'DC1' 'DC2' 'DC3' 'DC4' 'NAK' 'SYN' 'ETB' 'CAN' 'EM ' 'SUB' 'ESC' 'FS ' 'GS ' 'RS ' 'US ' \ 
' ' '! ' '" ' '# ' '$ ' '% ' '& ' \' '( ' ') ' ' ' '+ ' ', ' '- ' '. ' '/ ' \ 
'0 ' '1 ' '2 ' '3 ' '4 ' '5 ' '6 ' '7 ' '8 ' '9 ' ': ' '; ' '< ' '= ' '> ' '? ' \ 
'@ ' 'A ' 'B ' 'C ' 'D ' 'E ' 'F ' 'G ' 'H ' 'I ' 'J ' 'K ' 'L ' 'M ' 'N ' 'O ' \ 
'P ' 'Q ' 'R ' 'S ' 'T ' 'U ' 'V ' 'W ' 'X ' 'Y ' 'Z ' '[ ' '\ ' '] ' '^ ' '_ ' \ 
'` ' 'a ' 'b ' 'c ' 'd ' 'e ' 'f ' 'g ' 'h ' 'i ' 'j ' 'k ' 'l ' 'm ' 'n ' 'o ' \ 
'p ' 'q ' 'r ' 's ' 't ' 'u ' 'v ' 'w ' 'x ' 'y ' 'z ' '{ ' '| ' '} ' '~ ' 'DEL' \ 
) 
# end of character table 


# display the regular ascii characters 0 to 127 
for a in `seq 0 15` 
do 

    let "b=$a+16"; let "c=b+16"; let "d=c+16"; let "e=d+16"; let "f=e+16"; let "g=f+16"; let "h=g+16" 


    printf "%03d %03X % 3s | %03d %03X % 3s | " $a $a ${tb[$a]} $b $b ${tb[$b]} 
    printf "%03d %03X \\$(printf %03o $c) | %03d %03X \\$(printf %03o $d) | " $c $c $d $d 
    printf "%03d %03X \\$(printf %03o $e) | %03d %03X \\$(printf %03o $f) | " $e $e $f $f 
    printf "%03d %03X \\$(printf %03o $g) | " $g $g 

    if [[ $a -lt 15 ]];then 
    printf "%03d %03X \\$(printf %03o $h) \n" $h $h 

    else 
    printf "%03d %03X %03s \n" $h $h ${tb[$h]} 

    fi 

done 
# end reg ascii 

# begin extended ascii section 
echo ' ' 

# display the extended ascii characters 128 to 255 
for a in `seq 128 143` 
do 

    let "b=$a+16"; let "c=b+16"; let "d=c+16"; let "e=d+16"; let "f=e+16"; let "g=f+16"; let "h=g+16" 

    printf "%03d %03X \\$(printf %03o $a) | %03d %03X \\$(printf %03o $b) | " $a $a $b $b 
    printf "%03d %03X \\$(printf %03o $c) | %03d %03X \\$(printf %03o $d) | " $c $c $d $d 
    printf "%03d %03X \\$(printf %03o $e) | %03d %03X \\$(printf %03o $f) | " $e $e $f $f 
    printf "%03d %03X \\$(printf %03o $g) | %03d %03X \\$(printf %03o $h) \n" $g $g $h $h 

done 

# div 
echo -n "- - - - - - " 
printf "| - - - - - - %.0s" {1..7} 
printf "\n" 

# display footers for each column 
echo -n "DEC HEX CHR" 
printf " | DEC HEX CHR%.0s" {1..7} 
printf "\n" 

# EOF #