一:为什么计算机采用二进制
计算机是由逻辑电路组成,逻辑电路通常只有两个状态,开关的接通与断开,这两种状态正好可以用“1”和“0”表示。所以计算机只能识别二进制。
二:什么是二进制
二进制是计算技术中广泛采用的一种数制。二进制数据是用0和1两个数码来表示的数。它的基数为2,进位规则是“逢二进一”,借位规则是“借一当二”。
二:有两个位数,分别是0和1
进:这两个位数循环和重复使用
制:它是一种应用规范,目前主要直接源于和应用于计算机领域
所谓“逢二进一”是指等于2时,就进一位。
(即101+1=110)
例: 10111+1010=?
10111
+1010
—————
100001
所谓“借一当二”是指两个数相减时,向高位借1当作2使用。
(即110等价于102)
11011
-1101
————
1110
三:为什么对字符进行编码
在电脑中输入字符时,电脑要自动把它转换为二进制数,才能存储在电脑中。为了在计算机上也能表示、存储和处理像文字、符号等等之类的字符,就必须将这些字符转换成二进制数字。当然,肯定不是我们想怎么转换就怎么转换,否则就会造成同一段二进制数字在不同计算机上显示出来的字符不一样的情况,因此必须得定一个统一的标准进行转换。于是就设计出了进行这种转换的标准——字符编码标准。
四:字符编码的发展历程
1:ASCII
最开始计算机在美国发明使用,需要编码的字符集并不是很多,最早只有127个字符被编进计算机里,也就是大小写英文字母、数字和一些简单标点符号,其中可见字符95个(可见字符包括英文字母、数字、标点符号),控制字符33个(控制字符包括换行、回车、删除···),美国人将这128个字符集合称作ASCII字符集。如大写字母A的编码是65,小写字母a的编码是97。
随着计算机被迅速推广使用,欧洲的非英语国家的人们发现这套由美国人设计的字符集不够用了,于是扩充了ASCII编码规则,也就是从128一直扩展到255,又新增了128个字符,新增的128个字符叫作扩展ASCII字符集。通过对ASCII码的扩展似乎解决了一些欧洲国家的字符编码问题。
ASCII码的字符存储方式:直接将ASCII字符集的码位转化成二进制进行存储。
2:GB2312(1981年5月1日发布的简体中文汉字编码国家标准)
当电脑来到中国时,人们发现扩展之后的ASCII码也就只能表示256个字符,而中国常用的汉字也接近有上千了。在计算机中,把8位聚在一起的二进制位数称为一个字节(byte),故计算机中一个字节有256个状态。既然8位最多表示256个字符,那就只能用16位来表示一个字符。基于中国的字符数目庞大,设计字符集采用分区管理,共计94个区,每个区包含94个位,共8836个码位,收录7445个图形字符,其中包括6763个汉字。
01---09区收录除汉字外的682个字符。
10--15区为空白区,没有使用。
16--55区收录3755个一级汉字,按拼音顺序。
56--87区收录3008个二级汉字,按部首/笔画顺序。
88---94区为空白区,没有使用。
3:GBK(1995年12月发 布的汉字编码国家标准)
GBK是对GB2312编码的扩充,新增近20000个汉字和字符,对汉字采用双字节编码。GBK字符集共收录21003个汉字,包含国家标准GB13000-1中的全部中日韩汉字,和BIG5编码中的所有汉字。
4:GB18030(2000年3月17日发布的汉字编码国家标准)
GB18030是对GBK编码的扩充,覆盖中文、日文、朝鲜语和中国少数民族文字,共收录70244个汉字。GB18030字符集采用单字节、双字节和四字节三种方式对字符编码。兼容GBK和 GB2312字符集。
5:Unicode
国际标准字符集,它将世界各种语言的每个字符设定了统一并且唯一的码位,以满足跨语言、跨平台的文本信息转换。Unicode采用四个字节为每个字符编码。
6:UTF-8
UTF-8是 Unicode 的一种转换编码,用一到四个字节编码 Unicode 字符,相对于 Unicode 固定的四字节长度,更节省存储空间.
下面采用一个例子简述Unicode和UTF-8编码存储规则
(1)使用unicode字符集(定长编码)
字符 编号 二进制位
e 101 01100101
g 103 01100111
g 103 01100111
o 111 01100111
世 19990 01001110 00010110
界 30028 01110101 01001100
得到存储方式如下:
00000000 00000000 00000000 01100101 e
00000000 00000000 00000000 01100111 g
00000000 00000000 00000000 01100111 g
00000000 00000000 00000000 01100111 o
00000000 00000000 01001110 00010110 世
00000000 00000000 01110101 01001100 界
采用的是不管编号多大多小统一按最长的来,位数不够高位补零
显而易见的是大大的浪费内存,而且字符集收录的越多,编号跨度越大,
内存空间造成的浪费越多。
(2)使用UTF-8编码存储(变长编码)
编号 编码模板 字节
[0,127] 0XXXXXXX 1byte
[128,2047] 110XXXXX 10XXXXXX 2byte
[2048,65535] 1110XXXX 10XXXXXX 10XXXXXX 3~4byte
得到存储方式如下:
字符 编号 二进制位
e 101 01100101
g 103 01100111
g 103 01100111
o 111 01100111
世 19990 11100100 10111000 10010110
界 30028 11100111 10010101 10001100
采用小编号少占字节,大编号多占字节。极大减少了内存空间的浪费。
最后想表达一下我的真实想法:
写的比较通俗简单,源于我的个人专业能力不是很强,就是抱着整理归纳学习的思想写出来的,希望对大家都有所帮助。