扩展ASCII表输出的方法

时间:2024-03-07 13:32:26

=============================================================================================

20130225_第一次修改                         ccb_warlock

=============================================================================================

别人可能觉得这个工作没有意义而且浪费时间,我也是在回忆所知道的vc++6.0bug时才发现十进制254对应字符输出时居然是空白。当然也纯粹是出于好奇,于是自己想着编写程序来检验平时材料中的ASCII表内容是否如此。

 

由于水平有限,仅仅用c++编写,并通过vc++6.0编译运行在64位计算机上。

扩展ASCII表输出的方法

此图摘自谭浩强编写的c++程序设计(第二版)一书中的附录部分。

 

 

 

以下测试程序中我特意将ASCII值的测试范围定在1-256。当然实际查看ASCII表可知ASCII值实际是由0-255(8位二进制控制,28)。

特别注明:0是我在编写程序时自身疏忽漏考虑的,后面如果分析会有补充考虑;

256是我故意设置,目的是测试在超过0-255区间时vc++6.0的编译器是否会报错。如果不报错并能组建成功,程序运行后显示的是什么字符?(当然后面的测试就表明超过ASCII范围的值不做输出)

 

测试程序1

为了一个个区分测试,于是编写测1程序。为了方便,也特意在其中使用了while循环

 

源码部分:

#include<iostream>

using namespace std;

int main()

{

       int i=1;

       while(1)

       {

              char x;

              int y;

              cout<<""<<i<<"次试验"<<endl;

           cout<<"请输入一个十进制数据(相应转化为字符型) :";

              cin>>y;

              x=y;

              cout<<"char = "<<x<<endl <<endl;

              i=i+1;

      

       return 0;

}

编译组建通过。

注:当我对该文章第二次进行修改时发现自己的一个认识错误,由于这篇文章初稿距第二次修改时间间隔较大,当我一眼看到程序觉得这个程序即使能组建也成功,按道理会是个死循环(while循环在表达式为真时才会执行,可我第二次没看语句内容误以为程序没有中断,会进入死循环)。仔细看了语句后恍然大悟,其实在做输入时就是一个中断,所以死循环也就不存在了。

这件事也告诉我while循环(以及do-while循环)的表达式永真也不一定会形成死循环。


但是介于平时没有时间一一测试,于是想编写一个靠循环本身直接拉出一个列表结果。

   



测试程序2

由于时间原因,于是产生测2的程序。

 

源码部分:

#include<iostream>

using namespace std;

int main()

{

       for(int i=1;i<=256;i++)

       {

              char x;

              cout<<""<<i<<"次试验"<<endl;

           cout<<"请输入一个十进制数据(相应转化为字符型) :";

              x=i;

              cout<<"char = "<<x<<endl <<endl;

       };

       return 0;

}

编译组建通过。但是如下面两张图示,由于数据量过大,原先的测试内容没有办法展现,于是只能对程序进行一些小修改以达到数据展示的要求。

 扩展ASCII表输出的方法

扩展ASCII表输出的方法

 

 

  

测试程序3

为了解决程序所产生的问题,于是有了测3的程序。

 

源码部分:

#include<iostream>

using namespace std;

int main()

{

       for(int i=1;i<=90;i++)     //只需要将此句范围改为1-90,91-180,181-256即可

       {

              char x;

              cout<<""<<i<<"次试验"<<endl;

           cout<<"请输入一个十进制数据(相应转化为字符型) :";

              x=i;

              cout<<"char = "<<x<<endl<<endl;

 

       };

       return 0;

}

 

编译组建通过。

扩展ASCII表输出的方法

 

 

 

仔细看过测3的列表后产生了一个疑问,为什么拓展的ASCII表为什么没有输出?

询问老师后,老师告诉我的回答是拓展的ASCII表可能用于功能键,对此我再去需找更全面的ASCII表,于是找到下表。

 扩展ASCII表输出的方法



仔细看过这张表后,发现功能键仅有ASCII值为0-31的这32个,而拓展ASCII并没有功能键的记载。

于是通过百度寻找后终于找到了一个准确的解答(在此也感谢百度知道的平台支持)。

通过cmd只能输出基本的ASCII表(000~127序号)的原因是中文版操作系统里cmd的默认代码页使用的是936ANSI/OEM-简体中文GBK),而这个代码页是无法输出扩展ASCII表的。

不是标准码的部分必须输出前调整你的控制台窗口的默认代码页,把简体中文改成美国标准(当然这样修改后,程序就不能同时输出中文了)。
调整步骤:开始-运行-cmd-对着窗体右键-默认值-默认代码页。

经过测试后,上述解答的内容正确。


注:这里对c++里ASCII值为负值与超过255的数值能赋给字符型并能输出给出解释,即c++对这些数值的二进制形式进行截断性处理,详细测试内容在本blog里的《c++编译器对新建字符型数组内部数据的初始化》一文中。






即使有一天在技术上我已经是个能手,请记住自己应有的责任和保持一个真诚交流、始终渴望追求技术的心。                                                                     ----------ccb_warlock