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

写在前面

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

更易懂的打开方式

其实编码就是一种约定,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的编码值。

原文发布于微信公众号 - 互扯程序(chat_routine)

原文发表时间:2018-01-31

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏抠抠空间

python常见模块之time模块

一、模块简介 在Python中,通常有这几种方式来表示时间: 时间戳(timestamp):通常来说,时间戳表示的是从1970年1月1日00:00:00开始按...

34370
来自专栏蓝天

Cuckoo Hash和多级Hash的粗浅认识

通过对Cuckoo Hash、多级Hash和BloomFilter的粗浅了解,感觉它们三者存在类似之处,算是近亲(暂且把普通的Hash称作远亲)。

11300
来自专栏java达人

HashMap庖丁解牛

感谢erixhao的作品,长文需细品: Code Walkthrough是我们新的一个系列,主要以阅读,分析源代码为主要目的,特此介绍一下。我们先以最经典的JD...

22390
来自专栏阮一峰的网络日志

12种不宜使用的Javascript语法

这几天,我在读《Javascript语言精粹》。 这本书很薄,100多页,正好假日里翻翻。 该书的作者是Douglas Crockford,他是目前世界上最精通...

34680
来自专栏玄魂工作室

Python黑帽编程2.1 Python编程哲学

本节的内容有些趣味性,涉及到很多人为什么会选择Python,为什么会喜欢这门语言。我带大家膜拜下Python作者的Python之禅,然后再来了解下Python的...

32470
来自专栏cs

python笔记一 入门py

id()函数,是python内置函数,查看每一个对象的地址。 >>> help(id); Help on built-in function id in mod...

38160
来自专栏前端杂货铺

汉字数组排序及如何检测汉字

起因         最近接触了一道有意思的题目,就是单击表格的表头,根据表头的那一栏进行排序。恰好有一栏的数据全部是中文汉字,如果仅仅对于汉字数组使用默认的s...

32630
来自专栏JavaQ

写这样的方法让人很反感

写作文要做到段落清晰、每段思路流畅、每段主旨明确,要有一条清晰的线穿插整篇内容,编写程序代码和写作文是一个套路。一个类就像一篇小作文,类的单一职责就是小作文要叙...

34770
来自专栏深度学习自然语言处理

字符集及其存储方式(解决乱码问题)

阅读大概需要4分钟 在我们进行文本挖掘或处理文档时,都要面临一个最最基本的问题->就是解决乱码问题。在此,介绍最本质的字符编码。 我们熟悉的有三种:ASCII字...

35830
来自专栏工科狗和生物喵

【计算机本科补全计划】指令:计算机的语言(MIPS) Part4

正文之前 这几天陪人玩去了,所以没怎么看书。今早某人回家了。所以我也就可以一个人继续开始在图书馆的浪荡之路了。爽歪歪!!!!而且可以一个人独占温暖的地方,实在...

35560

扫码关注云+社区

领取腾讯云代金券