文章目录
1. 编码的作用
文字或者数据存储在计算机内是二进制的方式。
但是同样一个文字或者字符 存储的二进制数值是多少,就能编码有关。
比如 甲 把 字符 A 存在电脑里 是 001
但是 乙把 字符 A 存在电脑里 是 011
这样就带来一个问题,同样是 字符A,每个人都按照自己的心情来决定 对应的二进制编码。
1. 方便和统一管理
所以为了方便和统一管理,这个时候就有一套规范,大家都遵守,比如这套规范定义 字符A 是以 111
存放在电脑里,而且是唯一的一个编号。
2. 常用的编码方式
1. ASCII编码,英文存储到计算机里面
上面的表格摘抄了一部分的 ASCII 编码。
例如 字母 D
大家都在电脑里 存储为 68, 而反过来,如果使用 ASCII 编码,发现68,也意味着这是 字母 D
2. GB2312编码和GBK编码,将中文存储到计算机
上面的ASCII 只是解决了英文怎么存储的问题,但是中文 怎么存储到计算机里面去的,也需要一套规范。
这个时候,就出现了 GBK2312, GBK, GBK18030编码。
比如汉字 的 中
他的 GBK编码就是 D6D0, 同样 在计算机当中如果发现 D6D0, 且使用的是 GBK编码,则会转换成汉字 中
3. Unicode字符集,将全世界的文字存储到计算机
各个国家的编码方式都有自己国家的标准,一旦出了国,就需要各种转换,这个感觉有点像中国人说中文,英国人说英语一样,有没有可能大家都说同一门语言呢?
编码也是一样的,为什么不能有一套标准规范,大家都遵守呢?
就在这种呼吁下,Unicode 诞生了。Unicode 也称为统一码、万国码;看名字就知道,Unicode 希望统一所有国家的字符编码。
例如上面 的汉字 中
的 Unicode 编码 是 4E2D
3. UTF-8 和 Unicode 的关系
这里UTF-8 和 Unicode 经常会被搞混, Unicode相当于是一套规范,规定每一个 字符汉字,对应的 编码是多少。
严格来说,字符集和字符编码不是一个概念:
- 字符集定义了字符和二进制的对应关系,为每个字符分配了唯一的编号。可以将字符集理解成一个很大的表格,它列出了所有字符和二进制的对应关系,计算机显示文字或者存储文字,就是一个查表的过程。
- 而字符编码规定了如何将字符的编号存储到计算机中。如果使用了类似 GB2312 和 GBK 的变长存储方案(不同的字符占用的字节数不一样),那么为了区分一个字符到底使用了几个字节,就不能将字符的编号直接存储到计算机中,字符编号在存储之前必须要经过转换,在读取时还要再逆向转换一次,这套转换方案就叫做字符编码
例如 汉字 中
的 Unicode 编码 是 4E2D
但是 问题是 4E2D
怎么存储到 计算机里面,它的 二进制是 0100 1110 0010 1101
, UTF-8 就是一套方案, 在计算机里面怎么存储 这个二进制?
1. utf-8编码
- UTF-8
UTF-8 的编码规则很简单:
- 如果只有一个字节,那么最高的比特位为 0,这样可以兼容 ASCII;
- 如果有多个字节,那么第一个字节从最高位开始,连续有几个比特位的值为 1,就使用几个字节编码,剩下的字节均以 10 开头。
具体的表现形式为:
- 0xxxxxxx:单字节编码形式,这和 ASCII 编码完全一样,因此 UTF-8 是兼容 ASCII 的;
- 110xxxxx 10xxxxxx:双字节编码形式(第一个字节有两个连续的 1);
- 1110xxxx 10xxxxxx 10xxxxxx:三字节编码形式(第一个字节有三个连续的 1);
- 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx:四字节编码形式(第一个字节有四个连续的 1)。
xxx 就用来存储 Unicode 中的字符编号。
例如 汉字 中
的 Unicode 编码 是 4E2D
二进制是 0100 1110 0010 1101
, 则使用 utf-8 编码的话,16进制 是 e4 b8 ad
在计算机里存储的是 1110 0100 1011 1000 1010 1101
, 也就是 需要三个字节存储
0100 11 1000 10 1101
刚好是 Unicode 的编码
下面是一些字符的 UTF-8 编码实例(绿色部分表示本来的 Unicode 编号):
4. 计算机里面怎么使用编码
在计算机内存中,统一使用Unicode编码,当需要保存到硬盘或者需要传输的时候,就转换为UTF-8编码。
用记事本编辑的时候,从文件读取的UTF-8字符被转换为Unicode字符到内存里,编辑完成后,保存的时候再把Unicode转换为UTF-8保存到文件
浏览网页的时候,服务器会把动态生成的Unicode内容转换为UTF-8再传输到浏览器:
所以你看到很多网页的源码上会有类似<meta charset="UTF-8" />
的信息,表示该网页正是用的UTF-8编码。