bash未显示126以上的扩展ASCII字符
我写了一个小c程序来打印一个扩展的ASCII字符,该字符对应于值129bash未显示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=放
#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
+extended128-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)的字节序列。