bash未显示126以上的扩展ASCII字符

bash未显示126以上的扩展ASCII字符,bash,ascii,Bash,Ascii,我写了一个小c程序来打印一个扩展的ASCII字符,该字符对应于值129 #include<stdio.h> int main(void) { char a = 129; printf("%c\n",a); return(0); } #包括 内部主(空) { 字符a=129; printf(“%c\n”,a); 返回(0); } 在我的unix机器(Fedora16)上,在bash终端上编译并运行它。 它显示错误。背面有一个问号,背景为白色椭圆形 事实上,如果我把a=放

我写了一个小c程序来打印一个扩展的ASCII字符,该字符对应于值129

#include<stdio.h>
int main(void)
{
  char a = 129;
  printf("%c\n",a);
  return(0);
}
#包括
内部主(空)
{
字符a=129;
printf(“%c\n”,a);
返回(0);
}
在我的unix机器(Fedora16)上,在bash终端上编译并运行它。 它显示错误。背面有一个问号,背景为白色椭圆形

事实上,如果我把a=放在126以上,它会显示相同的问号


为什么会这样以及如何纠正它?

为什么您认为127以上有ascii字符


ascii基本上是7位,0-127首先,我怀疑这是bash的错;bash只是找到并运行程序,而实际显示程序的输出是终端应用程序的工作。其次,127以上没有ASCII字符。尝试打印128..255范围内的字符将发出一个具有给定值的字节,但该字节的显示方式取决于终端及其配置方式。最有可能的是,您的终端期望所有程序输出都以UTF-8编码;为了向后兼容ASCII,所有小于128的字节在UTF-8中都是有效字符,但是当涉及到128字节及以上的字节时,只有某些序列是有效的,并且一个单独的字节及其高位集是错误的。尝试从单个程序中按顺序打印字节226、152和131;如果你看到一个雪人,你就会知道你的终端正在使用UTF-8。

我写了一个bash脚本来显示ascii
0-127
+extended
128-255
。 它取决于系统代码页、终端/控制台等

字符0-3127显示非可打印表格中的代码。 其他所有字符都是打印到屏幕上的原始字符

#!/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 #
#/垃圾箱/垃圾箱
#
#阿西
#
#按照当前计算机的代码页打印扩展ascii表
#
#cls
echo-e\\033c
#每列的标题
echo-n“DEC HEX CHR”
printf“| DEC HEX CHR%.0s”{1..7}
printf“\n”
#div
回声-n“---”
printf“|-%.0s”{1..7}
printf“\n”
#ascii 0到127个字符的起始字符表
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”“可以”“EM”“子”“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'\
)
#字符结束表
#显示常规ascii字符0到127
对于序号0.15中的`
做
设b=a+16;设c=b+16;设d=c+16;设e=d+16;设f=e+16;设g=f+16;设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
如果[$a-lt 15]];则
printf“%03d%03X\\$(printf%03o$h)\n“$h$h
其他的
printf“%03d%03X%03s\n”$h$h${tb[$h]}
fi
完成
#end reg ascii
#开始扩展ascii部分
回声“
#显示扩展ascii字符128到255
对于序号128 143中的a`
做
设b=a+16;设c=b+16;设d=c+16;设e=d+16;设f=e+16;设g=f+16;设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
完成
#div
回声-n“---”
printf“|-%.0s”{1..7}
printf“\n”
#显示每列的页脚
echo-n“DEC HEX CHR”
printf“| DEC HEX CHR%.0s”{1..7}
printf“\n”
#EOF#

接受观点。现在的问题是关于扩展ASCII。您能告诉我为什么bash不显示扩展ASCII字符吗?@Saurabh:“不是单一的编码,通常是指现代UNIX系统默认情况下不会使用的编码。在现代,大多数非ASCII文本预计将采用UTF-8,这是一种完全不同的编码,其中127以上的单个字节无效。不,它没有显示任何雪人。。同样的白色问号和白色背景。。。还有其他想法吗?@Saurabh:你是否像你的例子一样,在打印字节的时候中间有换行符?这三个字节需要一个接一个地打印,中间没有任何其他字节;因此,在三个字节之后应该只有一个换行符。明白了。。现在它印了一个雪人。。那么,现在的要点是什么?我的终端配置为期望所有程序输出以UTF-8编码,这是一种现代方案。。。如何进一步了解它及其用法?@Saurabh:听起来可能有些疯狂,但你可以试试。@Saurabh:在UTF-8中,127以上的Unicode代码点被编码为两个或更多字节的序列,226-152-131恰好是雪人字符9731(0x2603)的字节序列。