Sorry, your browser cannot access this site
This page requires browser support (enable) JavaScript
Learn more >

在计算机系统中,ASCII是一个经常出现的术语。
这是一个信息表示的问题,需要从字节说起

1.什么是字节?

字节(byte)是计算机存储基本单位
1byte = 8 bit, 二进制数系统中,每个0或1就是一个位(bit)。
字符是最基本单位,1byte = 8bit。
比如一个文件是3byte,那么 其中是 3个,8位二进制,
比如ABC,就是,0110 0001,0110 0010,0110 0011
bit 中文名称是位,音译“比特”,是用以描bai述电脑数据量的最小单位。

     

2.为什么 1byte = 8 bit ?

ASCII码

image.png

最初计算机是美国人发明的,美国人觉得128个字符够用了。
ASCII表中一共 128个字符 128 == 2^7
128 二进制表示, 1111111,
0 二级制表示 0000000 需要7位。

原始的ASCII编码是7位的,所以有2^7=128个字符(包括一zhi些不可显示字符)。但是电脑里1Byte=8bit,有8位。早期的电脑不太可靠,数据经常出错,所以这1Byte的8位中最高为就用来做数据校验,一般是奇偶校验。
但是后来的电脑变得可靠了,校验的意义就没有那么大了,因此有了一个扩展ASCII字符集。扩展ASCII字符集包含2^8=256个字符,编码是8位的。扩展ASCII字符集中的前128个字符与原来的ASCII字符集相同(就是原来的ASCII字符集的7位编码前面加一个0),而后面128个字符高位都是1。

随着计算机的发展和深入,7位的字符有时已不够用,为此国际标准化组织又制定了ISO2022标准,它在保持ISO646兼容的基础上,规定了扩充ASCII字符集为8位代码,可表示256个字符.。

ps(C/C++的标准中,从来没有规定1byte等于8bit 。它只规定了:sizeof(char) = 1,除此之外,还有一项相关的规定就是:sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long) <= sizeof(long long)。 但是现实中,1byte确实绝大部分都是8bit的。其源头是tcp/ip协议中,有这样的规定。 所以,除非你做的系统不准备支持tcp/ip协议,否则,依循它的协议,使用1byte=8bit是最简单的)

3.其它语言怎么用二进制表示

随着计算机的流行,许多国家需要将自己的文字加入到计算机中,但是ASCII已经满了,于是出现了新的标准,Unicode,采用16进制表示编码,转换为二进制最多为21位。

汉字 16 进制 二进制
4e00 100111000000000

Unicode的缺点:,英文字母只用一个字节表示就够了,如果 Unicode 统一规定,每个符号用三个或四个字节表示,那么每个英文字母前都必然有二到三个字节是0,这对于存储来说是极大的浪费,文本文件的大小会因此大出二三倍,这是无法接受的。于是出现了
UTF(UTF是“Unicode Transformation Format”的缩写)
UTF对应编码

Unicode编码(十六进制) UTF-8 字节流(二进制)
000000-00007F 0xxxxxxx
000080-0007FF 110xxxxx 10xxxxxx
000800-00FFFF 1110xxxx 10xxxxxx 10xxxxxx

UTF-8的特点是对不同范围的字符使用不同长度的编码。对于0x00-0x7F之间的字符,UTF-8编码与ASCII编码完全相同。UTF-8编码的最大长度是4个字节。从上表可以看出,4字节模板有21个x,即可以容纳21位二进制数字。Unicode的最大码位0x10FFFF也只有21位。

例1:“汉”字的Unicode编码是0x6C49。0x6C49在0x0800-0xFFFF之间,使用3字节模板:1110xxxx 10xxxxxx 10xxxxxx。将0x6C49写成二进制是:0110 1100 0100 1001, 用这个比特流依次代替模板中的x,得到:11100110 10110001 10001001,即E6 B1 89。

例2:Unicode编码0x20C30在0x010000-0x10FFFF之间,使用4字节模板:11110xxx 10xxxxxx 10xxxxxx 10xxxxxx。将0x20C30写成21位二进制数字(不足21位就在前面补0):0 0010 0000 1100 0011 0000,用这个比特流依次代替模板中的x,得到:11110000 10100000 10110000 10110000,即F0 A0 B0 B0。

4.为什么一个汉字用多个字节表示

这是因为,在UTF-8中,为了节约空间,也为了兼容ASCII编码系统,将Unicode中原本用2个字节表示的字符表示成1~4个字节(具体转换规则在这里不赘述了),其中大多数汉字部分(比如“汉”)在UTF-8中为3字节,但是在中国大陆地区,GBK编码依然很常用,在GBK中,除ASCII字符外,都是一个字符占两个字节。所以,一个汉字占多少字节还是具体取决于编码

评论