ASCII
美国标准信息交换码(American Standard Code for Information Interchange),主要记录了现代英语和西欧字符。
共128个字符,1个字节,2的7次方,首位是符号位。
ASCII本质上就是一个字节表示的二进制数和字符的对应关系,注意,底层存储的还是二进制数,只是在展示的时候显示了对应的字符。
这样的对应关系,就生成了一套编码。ASCII是最早的一套标准的计算机编码,使用至今。
Unicode
学名:Universal Multiple-Octet Coded Character Set(通用多八位编码字符集),简称UCS,相对于ASCII来讲是多了8位,Unicode使用的是2个字节来表示字符,因此也称作UCS-2,2表示2个字节,最多可以表示65536个字符。后来又出现了UCS-4,是使用4个字节表示一个字符,容量扩大了一倍,防止不够用开发的一套Unicode编码。
Unicode码也称作统一码、万国码单一码,是计算机领域的标准,里面包含了我们所接触到的每种语言的统一切唯一的二进制编码。因此是跨语言、跨平台的,可以在不同的国家、不同的编程语言中使用。
Unicode使用16进制数映射字符或者称作码位:0-0x10FFFF
最多可以容纳1114112个字符或码位。码位就是已经有了这么多可以放置字符的位置,一共这么多位置,放不放字符就在这里。
下面是Unicode内部的数据组成结构,每一个绿色块代表一个字符位置(码位),整体分为128个组,每组又分为256个层,每一层又256行,每一行又256个码位。

注意,这些平面层,并不是全部到使用了的,Unicode计划使用了17个面,所以使用率其实很少,即17*65536=1114112个码位。
Unicode我们称之为是一种编码方式,是一个国际通用的统一的编码集合。
UTF-8
前面了解了Unicode,Unicode是一种统一编码集合,在真是的使用中并不会直接使用Unicode作为数据的存储和传输,我们将Unicode理解为编码的上层规范,具体的使用,需要实现Unicode规范,定义一个子集来使用。
比如UTF-8,UTF-8是Unicode的实现方式,UTF-8总,对于不同的字符使用不同长度的字节来表示,比如0x00—0x7F表示的是ASCII中的编码,使用一个字节存储。最大使用4个字节进行存储。
UTF-8中包含了各国语言的字符和基本英文等字符,是编程中最常用的编码格式,在编程中默认使用该编码格式。
其他编码格式
其他编码格式还有UTF-16、GBK、GB2312、ISO8859-1等。
这些都是实现方式,在不同的应用和国家中默认使用了不同的编码格式。
编程中对编码格式的称呼
我们在编程中,一般直接对UTF-8这些Unicode编码的实现方式称作为编码、编码方式、码表等,一般不会很在意具体是什么性质,反正都是字符字典、字符集合,就都称作编码,见到Unicode也称作编码,见到UTF-8也称为是编码或码表,不用在意具体的名称区分。
如果对编码方式这些内容详细的学习,其实是非常复杂的,涉及到了计算机底层的内容,也会涉及到很多的数据结构和数据转换的内容,我们从理论上去了解这些已经完全OK了,绝大多数开发工程师只是会用,并没有具体的了解到具体的局别。
编码
这里说的编码是一种执行动作,比如我们有一个字符串”中国”,那么在编程IDE中显示出来,这是使用的什么编码方式呢?使用的是Unicode,这里并不存在是哪一种编码的实现方式,这时候查询的还是Unicode。
我们在编程的时候,书写包含有中文的内容,使用UTF-8,将项目传递给其他人,其他人在本地设置为ASCII打开编辑的话,就会出现乱码,为什么呢?因为在ASCII中并不存在中文编码,对应不到位置,对应出来的内容肯定是错误的。
有一个文本内容,我们使用一种编码方式进行对应,得到一个字节数组,这样的过程成为编码。
解码
解码就是将编码后的字节数组还原为原数据的过程。
