什么是编码格式
从一个小问题引入
我们在学习C语言的时候,有一道必做的题目是将大写字母转换成小写,相信有点基础的同学都能不加思索的写出下面的代码:char toLower(char upper){
if (upper >= 'A' && upper <= 'Z'){
return upper + 32;
}else{
return upper;
}
}
要问为什么是这段代码?我们往往也能说得出:因为大小写字母在ASCII码上正好相差32(字符'a'为97, 字符'A'为65)。
我们在进行字符初始化的时候,往往会将字符初始化为'\0'。因为'\0'在ASCII码中对应的数值是0。
我们理所应当地知道char型字符对应的范围是0~127,因为ASCII码的范围就是0~127。
但是有没有想过,为什么是ASCII码?
所谓的ASCII码,又到底是什么?
编码格式介绍
要说起ASCII码,不得不说起编码格式。
我们知道,对于计算机来说,我们在屏幕上看到的千姿百态的文字、图片、甚至视频是不能直接识别的,而是要通过某种方式转换为0和1组成的二进制的机器码,最终被计算机识别(0为低电平,1为高电平)。
对于数字来说,有一套非常成熟的转换方案,就是将十进制的数字转换为二进制,就能直接被计算机识别(如5转换为二进制是 0000 0101)。但是对于像ABCD这样的英文字母,还有!@#$这样的特殊符号,计算机是不能直接识别的,所以就需要有一套通用的标准来进行规范。
这套规范就是ASCII码。
ASCII码使用127个字符,表示A~Z等26个大小写字母,包含数字0~9,所有标点符号以及特殊字符,甚至还有不能在屏幕上直接看到的比如回车、换行、ESC等。
按照这套SACII的编码标准,就很容易的知道,'\0'代表的是0, 'A'代表的是65,而'a'代表的是97,'A'和'a'之间正好相差了32。
ASCII码虽然只有127位,但基本实现了对所有英文的支持。所以为什么说char类型只占1个字节?因为char型最大的数字是127,转成二进制也不过是0111 1111,只需要1个字节就能表示所有的char型字符,因此char只占1个字节。
但是随着计算机的普及,计算机不但要处理英文,还有汉字、甚至希腊文字、韩文、日文等诸多文字,这时,127个字符肯定不够了,这时就引入了Unicode的概念。
Unicode是一个编码字符集,它基本涵盖了世界上绝大多数的文字(只有极少数没有包含),在Unicode中文对照表中可以查看一些汉字的Unicode字符集。
比如,汉字”七“在Unicode表示为十六进制0x4e03,表示成二进制位0100 1110 0000 0011,占了15位,至少需要两个字节才能放得下,有些更复杂的生僻字,可能占用的字节数甚至不止两位。
这就面临着一个问题,当一个中英文夹杂的字符串输入到电脑的时候,计算机是如何知道它到底是什么的?
就像上面的0100 1110 0000 0011,它到底是表示的是0100 1110和0000 0011两个ASCII字符,还是汉字”七“?计算机并不知道。所以就需要一套规则来告诉计算机,到底该按照什么来解析。这些规则,就是字符编码格式。
其中就包括以下几种。ASCII
UTF-8
GBK
GB2312
GB18030
BIG5
ISO8859
编码格式分类
ASCII
ASCII 编码前面已经介绍过,此处就不再多说了。它使用0~127这128位数字代表了所有的英文字母以及数字、标点、特殊符号和键盘上有但屏幕上看不见的特殊按键。
它的优点是仅用128个数字就实现了对英文的完美支持,但是缺点也同样明显,不支持中文等除英文以外的其他语言文字。
因此,ASCII码基本可以看做是其他字符编码格式的一个子集,