前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >计算机编码 - 更易懂的打开方式

计算机编码 - 更易懂的打开方式

作者头像
互扯程序
发布2018-03-26 16:47:27
1.1K0
发布2018-03-26 16:47:27
举报
文章被收录于专栏:互扯程序互扯程序

写在前面

对于计算机编码,记得当年上学学计算机时候肚子都被搞大了,不对,是脑袋被搞大了,后来勉强学会了吧,工作这么多年,真的是忘得一干二净,由于平时工作基本都是上层开发,感觉对二进制的概念都越来越模糊了,真是老了啊。回过头复习复习吧,顺便整理篇文章,同时也是整理自己的思绪。

更易懂的打开方式

其实编码就是一种约定,0代表什么,1代表什么,1000又代表什么,就像你女朋友跟你约定,撅噘嘴代表要亲亲,嗯哼两声是要抱抱,指指搓衣板表示你要受罚了,一瞪眼表示你要挨揍了。。。。

你女朋友发现这样很好使,不用天天跟你叨叨叨了,然后就设计了一整套的表情包,每一种表情都表示让你做的一件事情,而且你也烂熟于心,乖乖的执行着,没有发生过错误。

突然有一天,你女朋友想要逛街,发现之前设计的表情只能在家用,出门就不好使了,不够用了咋办?那买个口哨吧,扩展一下功能吧,吹一声,老娘口渴了,吹两声,老娘饿了。。。

一切都是这么美好,从此你们俩开开心心的过着没羞没臊的日子。

可是,隔壁老王媳妇注意到你们了,这么爽,这么过瘾,整套设计搬回家,一个一个试用,发现除了在家,逛街以外,还要种地,还是不够用,老王媳妇自己设计了一套表情包,保留之前好用的,去掉一些不好用的,增加了很多自己特色的表情包。

就这样,一传十,十传百,老张媳妇,老李媳妇......各种媳妇,各有各的表情包。

有一天老王媳妇,老张媳妇,老李媳妇想要交流经验,发现各自用的表情包不一样,没法沟通下去了啊。这时候妇女主任出现了,为了让大家统一管理自己的老公,为了让更多没有用到表情包的老刘媳妇,老马媳妇以后也能利用上,她废弃了之前所有的表情包,重新搞了一套全新的表情包,包括了所有人以及未来可能加入的人都能好好使用的表情包。

正经的

很久很久以前,有一群人,他们决定用8个可以开合的晶体管来组合成不同的状态,以表示世界上的万物。他们看到8个开关状态是好的,于是他们把这称为”字节“。

再后来,他们又做了一些可以处理这些字节的机器,机器开动了,可以用字节来组合出很多状态,状态开始变来变去。他们看到这样是好的,于是它们就这机器称为”计算机“。

我们在显示器上看见的文字、图片等信息在电脑里面,其实并不是我们看见的样子,即使你知道所有信息都存储在硬盘里,把它拆开也看不见里面有任何东西,只有些盘片。

假设,你用显微镜把盘片放大,会看见盘片表面凹凸不平,凸起的地方被磁化,凹的地方是没有被磁化;凸起的地方代表数字1,凹的地方代表数字0。硬盘只能用0和1来表示所有文字、图片等信息。

二进制数的每一个位表示一个计算机位(bit,简称位),8个位组成一个字节(byte)。那么一个字节可以表示256种含义(2^8=256)。

虽然机器是基于二进制的,但对人类来说,因为二进制数太长了,需要做精简。因此需要将其转换成十六进制(hexadecimal,简称hex)。转换方式很简单,使用“8421法”将四位二进制数转换成十六进制数的一位,比如:1010(binary)会转为A(hex)。在 C 语言中,十六进制数以”0x”或“0X”开头,A表示10,F表示16。

此后,00000000~11111111就可以用0x00~0xFF来表示了。

什么是字符?

字符是各种文字和符号的总称,包括各个国家文字、标点符号、图形符号、数字等。

什么是字符集?

字符集是多个字符的集合,字符集种类较多,每个字符集包含的字符个数不同,常见字符集有:ASCII字符集、ISO 8859字符集、GB2312字符集、BIG5字符集、GB18030字符集、Unicode字符集等

什么是字符编码?

1、 计算机要准确的处理各种字符集文字,需要进行字符编码,以便计算机能够识别和存储各种文字。

2、 字符编码(encoding)和字符集不同。字符集只是字符的集合,不一定适合作网络传送、处理,有时须经编码(encode)后才能应用。如Unicode可依不同需要以UTF-8、UTF-16、UTF-32等方式编码。

3、字符编码就是以二进制的数字来对应字符集的字符。 因此,对字符进行编码,是信息交流的技术基础。

常见的字符编码

常见的编码方式有:ASCII编码,GB2312编码(简体中文),GBK,BIG5编码(繁体中文),ANSI编码,Unicode,UTF-8编码等。

在计算机技术发展的早期,如ASCII(1963年)和EBCDIC(1964年)这样的字符集逐渐成为标准。但这些字符集的局限很快就变得明显,于是人们开发了许多方法来扩展它们。

ASCII码

ASCII 是基于罗马字母表的一套电脑编码系统,ASCII码使用一个字节编码,所以它的范围基本是只有英文字母、数字和一些特殊符号 ,只有256个字符(128个字符的标准ASCII码和附加的128个字符的扩充ASCII码)。

开始计算机只在美国用,所以ASCII的全名是(American Standard Code for Information Interchange,美国信息互换标准编码)。

后来,世界各地的都开始使用计算机,但是很多国家用的不是英文,他们的字母里有许多是ASCII里没有的,为了可以在计算机保存他们的文字,他们决定采用 127号之后的空位来表示这些新的字母、符号,还加入了很多画表格时需要用下到的横线、竖线、交叉等形状,一直把序号编到了最后一个状态255(从0开始)这就是128个字符的扩充ASCII码。

GB2312

GB2312又称为GB2312-80字符集,全称为《信息交换用汉字编码字符集·基本集》,由原中国国家标准总局发布,1981年5月1日实施,是中国国家标准的简体中文字符集。它所收录的汉字已经覆盖99.75%的使用频率,基本满足了汉字的计算机处理需要。在中国大陆和新加坡获广泛使用。

GBK

GBK字符集是GB2312的扩展(K),GBK1.0收录了21886个符号,它分为汉字区和图形符号区,汉字区包括21003个字符。

GBK字符集主要扩展了繁体中文字的支持。

GB18030

GB18030字符集标准解决汉字、日文假名、朝鲜语和中国少数民族文字组成的大字符集计算机编码问题。该标准的字符总编码空间超过150万个编码位,收录了27484个汉字,覆盖中文、日文、朝鲜语和中国少数民族文字。满足中国大陆、中国香港、中国台湾、日本和韩国等东亚地区信息交换多文种、大字量、多用途、统一编码格式的要求。

等中国人们得到计算机时,已经没有可以利用的字节状态来表示汉字,但是这难不倒智慧的中国人民,我们不客气地把那些127号之后的奇异符号们直接取消掉:

  • 一个小于127的字符的意义与原来相同,但两个大于127的字符连在一起时,就表示一个汉字;
  • 前面的一个字节(他称之为高字节)从0xA1用到 0xF7,后面一个字节(低字节)从0xA1到0xFE;

这样我们就可以组合出大约7000多个简体汉字了。

GB2312 --> GBK --> GB18030

  • GB2312是常用简体汉字;在这些编码里,我们还把数学符号、罗马希腊的字母、日文的假名们都编进去了,连在 ASCII 里本来就有的数字、标点、字母都统统重新编了两个字节长的编码。
  • 后来还是不够用,于是干脆不再要求低字节一定是127号之后的内码,只要第一个字节是大于127就固定表示这是一个汉字的开始,不管后面跟的是不是扩展字符集里的内容。结果扩展之后的编码方案被称为 GBK 标准,GBK包括了GB2312 的所有内容,同时又增加了近20000个新的汉字(包括繁体字)和符号。
  • 后来少数民族也要用电脑了,于是我们再扩展,又加了几千个新的少数民族的字,GBK扩成了 GB18030。从此之后,中华民族的文化就可以在计算机时代中传承了。
  • GB2312和GBK都是双字节,GB18030分单、双、四字节三个部分。

当时各个国家都像中国这样搞出一套自己的编码标准,结果互相之间谁也不懂谁的编码,谁也不支持别人的编码。ISO (国际标谁化组织)的国际组织解决了这个问题。 他们采用的方法很简单:废了所有的地区性编码方案,重新搞一个包括了地球上所有文化、所有字母和符号的编码!

Unicode

Unicode字符集编码是(Universal Multiple-Octet Coded Character Set) 通用多八位编码字符集的简称,支持世界上超过650种语言的国际字符集。

Unicode允许在同一服务器上混合使用不同语言组的不同语言。它是由一个名为 Unicode 学术学会(Unicode Consortium)的机构制订的字符编码系统,支持现今世界各种不同语言的书面文本的交换、处理及显示。

ISO 就直接规定必须用两个字节,也就是16位来统一表示所有的字符,对于ASCII里的那些“半角”字符,unicode包持其原编码不变,只是将其长度由原来的8位扩展为16位,而其他文化和语言的字符则全部重新统一编码。由于“半角”英文符号只需要用到低8位,所以其高8位永远是0,因此这种大气的方案在保存英文文本时会多浪费一倍的空间。

Unicode在很长一段时间内无法推广,直到互联网的出现,为解决Unicode如何在网络上传输的问题,于是面向传输的众多 UTF(UCS Transfer Format)标准出现了。 顾名思义:UTF-8就是每次8个位传输数据,而UTF-16就是每次16个位。

UTF-8

UTF-8就是在互联网上使用最广的一种Unicode的实现方式,这是为传输而设计的编码,并使编码无国界,这样就可以显示全世界上所有文化的字符了。

UTF-8最大的一个特点,就是它是一种变长的编码方式。

它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度,当字符在ASCII码的范围时,就用一个字节表示,保留了ASCII字符一个字节的编码做为它的一部分,(注意的是Unicode一个中文字符占2个字节,而UTF-8一个中文字符占3个字节)。

从Unicode到UTF-8并不是直接的对应,而是要过一些算法和规则来转换。

UTF-8的编码规则很简单,只有二条:

  • 对于单字节的符号,字节的第一位设为0,后面7位为这个符号的unicode码。因此对于英语字母,UTF-8编码和ASCII码是相同的。
  • 对于n字节的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的unicode码。

Base64编码

所谓Base64,就是选出64个字符:小写字母a-z、大写字母A-Z、数字0-9、符号"+"、"/"(再加上作为垫字的"=",实际上是65个字符)作为一个基本字符集。然后,其他所有符号都转换成这个字符集中的字符。

  • Base64主要用于将不可打印的字符转换成可打印字符,或者简单的说将二进制数据编码成ASCII字符。将二进制数据编码成ASCII字符主要的目的是能在纯文本内容中插入二进制数据。
  • Base64要求把每三个8Bit的字节转换为四个6Bit的字节(3*8 = 4*6 = 24),然后把6Bit再添两位高位0,组成四个8Bit的字节,也就是说,转换后的字符串理论上将要比原来的长1/3。

应用场景:

1. XML/JSON文件这是一个纯文本文件,如果要基于XML/JSON格式设计可以保存图片或其它附件的数据格式,那就需要将这些制数据转码成ASCII字符。

2. 在email传输中,加密是肯定的,但是base64加密的目的不是让用户发送非常安全的Email。这种加密方式主要就是“防君子不防小人”,达到一种一眼看上去看不出内容的效果。

3. base64编码是用来解决把不可打印的内容塞进可打印内容的需求的。比如把图片存到数据库,图片数据归根到底还是一堆二进制串,用base64编码后的显示成的字符串就大大缩小的长度,可以存到数据库。

4. 满足电子邮件中不能直接使用非ASCII码字符传输数据的规定,所以使用base64进行编码后传输,因为base64的64个字符肯定有对应的ascii编码。

5. 微软的MHT格式这是模仿邮件格式将多种资源打包在一个文件中的格式,所有二进制资源都采用Base64编码。

6. 请不要再叫base64加密,请叫base64编码

转换过程

1. 将每三个字节作为一组,一共是24个二进制位。

2. 将这24个二进制位分为四组,每个组有6个二进制位。

3. 在每组前面加两个00,扩展成32个二进制位,即四个字节。

4. 根据下表,得到扩展后的每个字节的对应符号,这就是Base64的编码值。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-01-31,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 互扯程序 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档