C语言中字符型变量最高位问题和ASCII解释以及拓展EASCII(ISO/8859-1)

前言

  1. 本博文基于VC6.0++编译环境编写;

先搞懂几个概念

  1. 字节:计算机中数据存储的基本单位;一个字节是8个比特位;
  2. 字符:各种文字和符号的统称;比如一个英文字母是一个字符,一个汉字是一个字符,一个标点符号也是一个字符;
  3. 字符集:就是某个范围内字符的集合,不同的字符集规定了字符的个数,比如 ASCII 字符集总共有128个字符,包含了英文字母、阿拉伯数字、标点符号和控制符。而 GB2312 字符集定义了7445个字符,包含了绝大部分汉字字符。
  4. 字符编码:将字符集中的字符码映射为字节流(数字)的一种具体实现方案;计算机无法直接存储字符;只有将字符和相应的数字形成标记关系,才能正常字符集与字符编码有种对应关系常见的字符编码有 ASCII 编码、UTF-8 编码、GBK 编码等。 例如 ASCII 字符集对应 有 ASCII 编码。ASCII 字符编码规定使用单字节中低位的7个比特去编码所有的字符。例如”A” 的编号是65,用单字节表示就是0×41,因此写入存储设备的时候就是b’01000001’。
  5. 编码:将字符转换成字节流(数字);
  6. 解码:将字节流(数字)解析为字符;

现象

在C语言中,字符型(char)变量占用一个字节(8bit,0000 0000)(分配几个字节是编译器说了算,不同的编译器可能并不一样),但是对照ACII表格时可以发现,在这个8bit中,最高位并没有在ASCII中变成1,并且ASCII表中包括空字符(NULL,0000 0000)在内的一共只有128个字符(0~127);说到这里啊还是先来说一下这个ASCII故事吧!

故事

计算机发明于美国,在英语世界里,常用字符非常有限,26个字母(大小写)、10个数字、标点符号、控制符,这些字符在计算机中用一个字节的存储空间来表示绰绰有余,因为一个字节相当于8个比特位,8个比特位可以表示256个符号。于是美国国家标准协会ANSI制定了一套字符编码的标准叫 ASCII(American Standard Code for Information Interchange),每个字符都对应唯一的一个数字,比如字符 “A” 对应数字是65,”B” 对应 66,以此类推。最早 ASCII 只定义了128个字符编码,包括96个文字和32个控制符号,一共128个字符只需要一个字节的7位就能表示所有的字符,因此 ASCII 只使用了一个字节的后7位,剩下最高位1比特被用作一些通讯系统的奇偶校验。下图就是 ASCII 码字符编码的十进制、二进制和字符的对应关系表
这里写图片描述

最高位和ASCII的拓展EASCII(ISO/8859-1)

然而计算机慢慢地普及到其他西欧地区时,发现还有很多西欧字符是 ASCII 字符集中没有的,显然 ASCII 已经没法满足人们的需求了,好在 ASCII 字符只用了字节的7位 0×00~0x7F 共128个字符,于是他们在 ASCII 的基础上把原来的7位扩充到8位,把0×80-0xFF这后面的128个数字利用起来,叫 EASCII ,它完全兼容ASCII,扩展出来的符号包括表格符号、计算符号、希腊字母和特殊的拉丁符号。然而 EASCII 时代是一个混乱的时代,各个厂家都有自己的想法,大家没有统一标准,他们各自把最高位按照自己的标准实现了自己的一套字符编码标准,比较著名的就有 CP437, CP437 是 始祖IBM PC、MS-DOS使用的字符编码,如下图:这里写图片描述
众多的 ASCII 扩充字符集之间互不兼容,这样导致人们无法正常交流,例如200在CP437字符集表示的字符是 È ,在 ISO/8859-1 字符集里面显示的就是 ╚,于是国际标准化组织(ISO)及国际电工委员会(IEC)联合制定的一系列8位字符集的标准ISO/8859-1(Latin-1),它继承了 CP437 字符编码的128-159之间的字符,所以它是从160开始定义的,ISO-8859-1在 CP437 的基础上重新定义了 160~255之间的字符
这里写图片描述

关于中文的GBK码 (汉字内码扩展规范)

ASCII 字符编码是单字节编码,计算机进入中国后面临的一个问题是如何处理汉字,对于拉丁语系国家来说通过扩展最高位,单字节表示所有的字符已经绰绰有余,但是对于亚洲国家来说一个字节就显得捉襟见肘了。于是中国人自己弄了一套叫 GB2312 的双字节字符编码,又称GB0,1981 由中国国家标准总局发布。GB2312 编码共收录了6763个汉字,同时他还兼容 ASCII,GB 2312的出现,基本满足了汉字的计算机处理需要,它所收录的汉字已经覆盖中国大陆99.75%的使用频率,不过 GB2312 还是不能100%满足中国汉字的需求,对一些罕见的字和繁体字 GB2312 没法处理,后来就在GB2312的基础上创建了一种叫 GBK 的编码,GBK 不仅收录了27484个汉字,同时还收录了藏文、蒙文、维吾尔文等主要的少数民族文字。同样 GBK 也是兼容 ASCII 编码的,对于英文字符用1个字节来表示,汉字用两个字节来标识

本博客内容大部分来自下面这位朋友的博客,感谢这位朋友的分享,内容我稍有改动:
https://blog.csdn.net/qq_41888542/article/details/81128715
还参考了一个网站:
查ASCII码:http://ascii.911cha.com/
查EASCII码:http://ascii.911cha.com/eascii.html
查GBK码:https://www.qqxiuzi.cn/zh/hanzi-gbk-bianma.php