写在前面
对于计算机编码,记得当年上学学计算机时候肚子都被搞大了,不对,是脑袋被搞大了,哈哈,后来勉强学会了吧,工作这么多年,真的是忘得一干二净,由于平时工作基本都是上层开发,感觉对二进制的概念都越来越模糊了,真是老了啊。回过头复习复习吧,顺便整理篇文章,同时也是整理自己的思绪。
更易懂的打开方式
其实编码就是一种约定,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表示15。
此后,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的编码值。
推荐阅读:
技术:教你从零开始搭建阿里云ESC服务器(建站)新手必看!
技术:飞机上可以连WIFI了,它背后的黑科技是什么?
技术:Java9逆天的十大新特性
技术:2018,如何从小白升级到大牛程序员呢?
技术:http2.0的时代真的来了...
工具:如何通过技术手段 “干掉” 视频APP里讨厌的广告?
工具:通过技术手段 “干掉” 视频APP里讨厌的广告之(腾讯视频)
工具:抓包神器之Charles,常用功能都在这里了
干货分享:
分享:1T 软件开发视频资源分享
分享:深度机器学习56G视频资源分享
知识分享:现在是资源共享的时代,同样也是知识分享的时代,如果你觉得本文能学到知识,请把知识与别人分享