✨编码原理
🌈基础概念
🌻1.字符
一个单独的字符,通常是字母、数字或符号。
字符可以通过计算机的字符编码系统来表示,例如 ASCII 编码、Unicode 编码等。
字符是计算机程序、文本文件、网页等的基本单位,在计算机中通常以字节的形式存储。
🌻2.字符集
一堆字符组成的集合叫做字符集。
字符和字符集电脑一个都不认识,计算机只认二进制,只能以比特的形式记录0和1,为了让计算机识字,就需要把这些字符用0和1表示出来。
🌻3.字符编码
把字符转换为0和1的规则就叫做字符编码。
🌈怎么将字符编码变成0和1呢?
可以选定一个字符集,让字符排在上面,就如下面这个表一样。
00 01 10 11
00 大 小 高 低
01 啊 哇 额 人
10 他 有 哦 是
11 等
码位
每个字符都有对应的码位(例如,上表中'有'的码位就是1001)。
码空间
每个字符所占位置就是码空间,码空间越大,字符集就越大。
🌈各种编码的形成过程
🍺ASCII码的形成
计算机存储数据的基本单位是字节(Byte),一个字节由8个二进制组成。也就是8个bit,每个bit分为0和1两种状态,8个bit一共有2^8个,也就是256种不同的状态。
所以如果只用一个字节长度来编码字符,也就是用8个0或者1来代表一个字的话,那么这个字符集就能容纳256个字符,听起来很少对不对?但对于英文来说就已经够了,因为他们只有26个英文字母嘛,所以在上世纪60年代,美国人先搞出来了美国信息交换标准代码,简称ASCII,ASCII总共收录了128个字符,包括大小写拉丁字母、数字、常用标点以及像ESC、换行这些看不见的控制字符。
到此为止,事情都很简单,无非就是给这128个字符按照顺序排号,再把序号转换为二进制数字,需要显示的时候,从计算机存储的ASCII字符集中按编号调用字符,就能在屏幕中显示出来了。
🍺ASCII的升级版EASCII
一个字符集对应一个编码规则,不会出错,一切都很清晰、简单、完美。但是这世上远远不止英文一种语言哇,当各国都进入信息化时代社会的时候,文字显示的乱纪元就开始了,上面说过,用一个字节编码字符最多能容纳256个码位。英文总共才那点字符,256个码位用完都还剩下一半。所以西欧一些国家就搞了扩展美国信息交换(EASCII),也就是用剩下的这128个空位来表示其他字符,比如有注音符号的的法语字母,西班牙语的特殊标点,数学上常用的α、β等希腊字母,以及一大堆特殊符号等等。
这时候问题就已经冒头了,各国搞定EASCII字符集和编码后面128字符都不太一样,一共搞出了200多种,互不兼容,就算是同样一串二进制数,在不同的EASCII中对应的字符也不同所以同一份文本,哪怕放到不同语言的计算机中打开,都可能出现乱码。
🍺写代码时汉字占两位的缘由
对于汉字源远流长,数量可太多了,我国1980年公布的GB 2312-80信息交换用汉字编码字符集 基本集就包含了6763个常用简体汉字以及一些标点、符号、数字、拉丁字母等。那很显然,一个字节长度最多只能编码256个字符,对于汉字来说根本不够用,所以GB 2312-80用两个字节来编码一个字符(这也就是为什么我们在写代码的时候汉字占两位),这样理论上就可以容纳2^16也就是65536个字符,现在输入法里的全角标点符号就是用两个字节编码的,而半角标点符号就是用一个字节编码的。
🍺框框—'▯'的形成
不过,GB 2312-80字符集里这六千多汉字,只是最常用的汉字,其实根本不够用,比如像喆、祎,这些人民中常见字甚至都不包括在内,那字符集里没有那个字怎么办呢?那就是打不出来,那些字就会变成'▯'。
🍺广为人知的GBK
日本用日本汉字,韩国用朝鲜汉字,大家都搞出了自己的字符集和编码规则,都优先考虑本地人使用方便,相互之间的兼容性很差,后来微软被逼急了,就根据各地字符集和字符编码自己扩展了GB 2312字符集,加入了一些繁体汉字,这份扩展的字符集,后来成为了汉字内码扩展规范GBK(国家扩展规范)。
🍺超级大的字符集——万国码(UNICODE)
我们搞一个超大字符集,囊括人类世界所有的字符,然后编码出来供全世界使用,不就解决字符集不互容的问题了,这个超级大的字符集,就是万国码(UNICODE)。Unicode决定以书写系统为标准来分类和收录字符,像英语、法语、德语都属于一套书写系统——拉丁字母,如今Unicode已经有了1114112个码位,并平均划分为17个平面,每个平面都有65536个码位,在单个平面上再根据具体的用途划分出区块,区块相当于把同类字符放在一起以方便检索和补充。UTF-8、UTF-16、UTF-32等都是把Unicode字符集中的字符转换成二进制信息的编码方式,目前最常用的就是UTF-8。纯文本文件:编码应使用UTF-8。
因为即使是同一串二进制数字在不同的字符集和编码方式下也会对于不同的字符,所以如果用错误的编码打开文本就会出现乱码。
有了上面的知识储备下面就回归本文最大的问题——锟斤拷�⊠是怎样炼成的?
🍺【锟斤拷】的形成过程
GBK和Unicode都有很多使用者,用GBK编写的字符用UTF-8打开就会无法正常显示,Unicode就会用这个替换字符�来展示所有无法展示显示的字符,如果此时再根据UTF-8编码保存,重新使用GBK编码打开,如果有两个�,那么EFBF BDEF BFBD这三个码位对应的就是【锟斤拷】三个字,也就是说两个�相当于一个【锟斤拷】,所以你在看下载的小说等等才会出现【锟斤拷】。