首页 > 技术文章 > 计算机编码随记

luckylihuizhou 2017-01-22 18:08 原文

  之前转计算机这行,总会碰到各种英语缩写专业术语,刚开始总容易被这些陌生缩写词吓尿,这感觉就像小时候放学碰到了染了头发的小混混,嘴里叼根烟,感觉好像很牛逼的样子,从他身边过,都不敢多看他一眼,后来熟悉了后,发现人家可能和我一样是个"怂包"。

  说这些废话,无非是想说,很多知识本身并不可怕,并不那么难,可怕的是害怕难,害怕麻烦的心态。

  说说编码,使用电脑时就经常会看到很多编码,比如保存一个文本文档会看到保存编码可选ANSI,Unicode,UTF-8,完全不知道这些是什么鬼啊,首先我们来了解一下什么是编码,“编码是信息从一种形式或格式转换为另一种形式的过程,也称为计算机编程语言的代码简称编码”,这是百度百科里的解释,这种解释对于我们接触计算机稍多的人来说可以理解,但如果一个小朋友或者你的小白女朋友问你什么是编码,你这么说人家也未必能理解啊,编码编码,拆开来看,编就是想和制定的意思,码有符号的意思,按字面意思理解就是

人们编出的一种符号,这就是编码,这里我们说的既然是计算机编码,拓展一下编码的意思就是: 人们编出的一套和计算机有关的关于符号的规则。

  这样的话,如果我的小外甥问我计算机编码是什么意思?我就可以这样告诉他,你们有语文老师,有数学老师,每个老师会让你们遵守一套规则,比如语文老师要求回答问题就举左手,要上厕所就举右手,不知道就低下头,数学老师要求可能又是回答问题举右手,想上厕所就站起来等,这样你们遵守了这一套规则就可以正常交流了,同样的道理,这个计算机编码也是一样,有个叫计算机的老师,他是个机器人,他和我们交流又约定了一套规则用以保证能正常交流,这就是计算机编码。

  那么我外甥可能又会问,这每个老师都制定一套自己的规则是不是不好呢,如果我搞混了怎么办?额,的确会这样,所以校长就会发现这个问题嘛,然后开个会,和各位老师商量一下,统一一下所有规则,让所有的小朋友只记住一个规则就能和每个老师交流了。

  这样的话什么编不编码的很简单嘛,为什么我们外行人入门时看到什么 ASCII编码,Unicode编码,UTF-8编码之类的觉得好可怕?其实就是几个名词而已,你可以把前面的比喻挪过来,ASCII编码是语文老师制定的规则,Unicode编码是校长大人制定的规则,UTF-8编码是数学老师制定的规则,只不过名字变成了英文缩写,什么ASCII听起来来这么怪,不要怕,外国人听到中国的什么乾坤大挪移是一样觉的很怪,无非都是一系列的人为制定的规则。

  比喻打完了,下面来继续解释解释几条编码标准。

  先从ASCII编码开始吧,ASCII编码全称是American Standard Code for Information Interchange,即美国信息交换标准代码。前面浅析计算机二进制的时候,讲到计算机只能以二进制01的方式记录我们人类的数字,但如果只是用二进制帮我们计数,计算机无非就是个计数器而已,充其量相当于我们的算盘,但是这显然不够啊,既然可以帮我们计数,那是不是也可以帮我们记我们的文字符号等等啊,这样如果我们约定,1就是表示a,2就表示b,3就表示c,以此类推,存到计算机里的数读出来后,我找到这个约定手册,反过来转成10进制后对照一下,发现是数字1,2,3,这样我就能知道这3个数字分别代表a,b,c了。但是这个约定规则不能大家都各自约定一套啊,要不从计算机里的读出的数,我按我的约定翻译过来是abc,按另一个人的约定又不知道翻译成了什么了,如果这样那么计算机不就变成了密码机了吗?每次翻译数据还要找密钥才能破解里面的信息,爱好和平的程序员鼻祖们于是开了个会,统一了一套标准,然后批量印刷出一本本小册子,上面写着ASCII宝典,从此把一些他们要用的字符翻译到计算机里,要用的时候,又能从计算机里翻译出来,多好啊,这样很多要用笔和纸记录的文字诸如说明书,情书什么的都可以放到计算机里了,省下了好多纸。

  那么这个ASCII码又是怎样的呢?又有什么特点呢?降龙十八掌好歹还收录了18掌呢,这个ASCII码表一开始制定了127条准则,比如

   65 代表 A    66 代表 B  67 代表  C    ....  88 代表X   89 代表Y    90 代表Z。

       97 代表 a    98 代表 b  99  代表 c     ....  120 代表 x   121 代表y   122 代表 z 。

       我们可以看到大写字母排到了小写字母前面,这都是人为制定的,当然其他还有各种键盘上看到的符号啊,也给他们制定了代表规则,这里就不列举了,这样的话,大家如果都按这个ASCII码表作为标准的话,用计算机记录各种英语文档啊,当然没有问题了,但是制定了这个ASCII码表的那些人只考虑了英语怎么转换,这个计算机总是会有其他语种的国家使用嘛,比如中国人,俄罗斯人,总不可能大家为了计算机干脆就统一全球都学英语吧,如果能这样,那美帝真的就凭借计算机征服了全世界啊,英语26个字母算上大小写才52个,中国的汉字那么多(具体有多少可以看看辞海收录了多少个字),是不是我们中国人也得往这个ASCII表里追加我们的规则啊,比如 128 表示 我 129 表示 你 130 表示他,假设有 2万个汉字,那么我们追加2万个准则不就好了,这样把ASCII码这本小册子改个名字叫  ASCII码升级版之中华神机宝典(GBK编码) ,然后日本人拿到ASCII码和计算机后,又按他们的想法追加了他们的准则,改名叫 ASCII码之日本版,俄罗斯有 ASCII码之俄罗斯版,虽然一个地区的江湖是统一了,但是这些地区之间的规则还是有冲突啊,于是一个叫国际标谁化组织的联盟决定结束这个混乱的局面,他们协商兼顾各个语言使用者的需求发布了ASCII码之一统江湖版(Unicode编码),这个规则理论上的确能解决所有地区的问题,但是人嘛终究不是神,这个统一版Unicode编码终究还是有一些缺点,还需要改进升级一下(具体原因后面解释一下),然后就有了各种升级版本,其中有个版本(UTF-8编码)既能弥补前面说的Unicode编码缺点问题,又能完成统一规范的作用,变成一种广为使用的规范样本,这样我们就知道了这些个编码规则之前的相互关系,了解了他们整体的关系,就可以详细的了解具体这些编码的编码特点了。

   

  问题:计算机是怎么识别区分一个 二进制数据到底是数字还是字符的,例如 65对应的二进制数是01000001,这个数在ASCII表里对应的是 A, 那么计算机怎么区分是数字65还是字母A呢?

  我觉得这个到底怎么存,得取决于这个数据的变量类型吧?如果定义是整数型,那么数据直接按二进制数据存储,如果是字符型,那就得按编码表转成对应的数字再存储,所以变量的数据类型必不可少啊,以前觉得c语言要给变量声明变量类型,现在知道为什么了,

 

 

  

 

推荐阅读