字符编码

ASCII

在计算机刚诞生的时候,采用8个bit作为一个字节( byte ),每个 bit 其实二进制的一位长度,即8bit = 00000000(0) ~ 11111111(255),因此一个字节的最大长度为 255。那么两个字节的最大长度就是 65535, 依次类推。

由于计算机诞生于美国,美国使用的语言又是字母、数字和标点符号组成,因此被编码到计算机中的字符只有127个,我们称这个编码为 ASCII 码。比如大写字母 A 的编码是 65。

后来由于计算机在全球范围得到广泛应用,因为各国语言不同的原因,一个字节就开始不够用了,比如中文就需要至少两个字节才能表示。所以中国也制定了自己的 GB2312 标准。

Unicode

可以想象,像中国一样,每个国家都一套自己的编码标准,那么久很难做到统一。比如中文,在其他国家的标准中就会呈现为乱码,因此,需要一种能够统一的一套编码,那就是 Unicode

Unicode 把所有语言统一到一套编码中,这样在全球范围内,就不会出现乱码了。Unicode 通常用两个字节表示如整数范围:00000000 00000000 ~11111111 11111111

如果用 Unicode 编码表示 A,那么 A = 00000000 01000001,即在ASCII 中不够两个字节的,需要前面8位补零

UTF-8

Unicode 统一采用两个字节甚至更多的做法也会产生新的问题,虽然做到了统一编码,但是如果我们的文档大多采用英文的话,那么Unicode的两个字节 和 ASCII 的一个字节,在内存中就需要多出一倍的存储空间,所以在内存和传输上就比较浪费资源。

所以,为了尽可能节省内存,UTF-8 编码就应运而生了。跟 Unicode 一样,UTF-8 也是一套统一的编码,但是唯一的不同是,UTF-8 会根据字符实际占用字节的大小,进行编码,比如原本在 ASCII 编码中的英文字母,在 UTF-8 中也只占用一个字节;中文通常占用三个字节。在编码方面,UTF-8做到了统一和节省内存资源。

文本在计算机内存中,仍然统一使用 Unicode 编码,当需要保存到硬盘或者需要传输的时候,就转换为UTF-8编码。

用记事本编辑的时候,从文件读取的UTF-8字符被转换为Unicode字符到内存里,编辑完成后,保存的时候再把Unicode转换为UTF-8保存到文件。

浏览网页的时候,服务器会把动态生成的Unicode内容转换为UTF-8再传输到浏览器: