位和字节
位和字节对程序员而言应该是无需赘述的概念,如果你是程序员出身,且对这两个概念不甚了解的话就需要反思了。
位:数据存储的最小单位。在计算机中的二进制数系统中,位,简记为b,也称为比特,每个0或1就是一个位(bit)。计算机中的CPU位数指的是CPU一次能处理的最大位数。
通俗地说,位就是指一个二极管的状态0/1(开/关)。
字节:字节(Byte )是计算机信息技术用于计量存储容量的一种计量单位,作为一个单位来处理的一个二进制数字串,是构成信息的一个小单位。最常用的字节是八位的字节,即它包含八位的二进制数。
位和字节的关系可以理解为,英语是由26个字母组成,但是讲话时,却是用多个单词拼成的句子。单个字母并无实际意义(某些特例除外)。
字符
字符是指能够表达含义的不可分割的最小单位。字符包括字母、数字、运算符号、标点符号和其他符号,以及一些功能性符号。
字符集
顾名思义,字符集就是指字符的集合。不同的人群或不同的场景需要不同字符集,因此当下有很多种
字符集。字符集中所有字符是按照指定书序进行排列的,常见的字符集有:ASCII 、GB2312 GBK、BIG5、Unicode。
其中Unicode 又称为万国码,旨在收集全球所有的字符,为每个字符分配唯一的字符编号。
Unicode是国际组织制定的可以容纳世界上所有文字和符号的字符编码方案。目前的Unicode字符分为17组编排,0x0000 至 0x10FFFF,每组称为平面(Plane),而每平面拥有65536个码位,共1114112个。然而目前只用了少数平面。
字符编码
计算机中各种数据都是以二进制存储的,既然字已经有字符集了并且字符集是有顺序的,那在存储字符时直接使用字符的位置序号不就可以了吗?可以解决问题,但不是最佳解决方案。如果直接使用位置序号,会带来极大空间的浪费。比如讲英文的国家,通常只需要用到位于Unicode字符集靠前部分的字母(前128位,即ASCII字符集中字符),即一个字节就能表达出其位置,但存储时却需要三个字节来存储(高位补0)。
高位补0的原因是:比如两个单字节的字符连在一起时,无法区分是一个双子节字符还是两个单字节字符。
字符编码存在的意义是,通过一定的规则,用尽可能少的字节表示字符在字符集中的位置(建立映射关系)。因此字符集必须和编码方式搭配使用。Unicode常见的编码方式有:UTF-16 、UTF-8 、UTF-32。
有些字符集既是字符集也是字符编码,比如GBK。
打开txt时,文字是如何被打印到屏幕上的?
- 文本程序以流的方式将文件读取到内存中
- 在对流进行解析时,会指定编码格式,比如UTF-8
- 通过UTF-8编码后,就可以获知该字符在字符集中(Unicode)的位置序号
- 通过位置序号转化位对应的字符,并加以展示。
如果文件本身不是通过UTF-8编码的,在读取时以UTF-8编码,就会导致解码失败,从而出现乱码。