计算机只能处理数字, 但是如果要处理文本,就要将文本转化为数字才能处理。最早的计算机采用8位作为一个字节,也就是说最大只能存储到十进制的255。
为什么会出现这种情况呢?因为计算机最早是美国人发明的,英语只需要包含二十六个大小写字母和0-9数字再加上一些字符,一共127个。这个编码表称为ASCII码表。
但是随着计算机的发展,中国人也开始用计算机,我们也想在计算机中存储我们的中文字符,存储中文字符至少需要两个字节以上的内存, 于是GB2312编码表诞生了,GB2312里面加入了中文字符。
可以想到的是,既然中国人想将中文字符存入计算机, 那么韩国人呢?日本人呢? 然后韩国人发明了Euc-kr, 日本人发明了Shift_JIS。这些编码表(包括GB2312)如果存储其他国家的文字就会出现乱码。这显然不能作为国际通用的编码表。
基于这种情况,Unicode应运而生,它里面包含了所有国家的文字。Unicode通常使用2个字节编码(一些生僻的字符需要更多字节),也就是最大值为65535,这就容易解释为什么有些字在新华字典上面有,但是在电脑里面打不出来。由于Unicode包含了所有国家的字符,显然不可能再存在出现乱码的问题。
Unicode真的这么好吗?也不尽然,对于全英文的文件来说,使用Unicode比ASCII要多一倍的存储空间,这在数据的传输个存储上显然不合理。于是出现了把Unicode编码转化为"可变长编码"的UTF-8编码。
UTF-8不是固定字长编码的,而是一种变长的编码方式。它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。这是种比较巧妙的设计,如果一个字节的第一位是0,则这个字节单独就是一个字符;如果第一位是1,则连续有多少个1,就表示当前字符占用多少个字节。
UTF-8编码把一个Unicode编码的字符用不同的长度来表示,英文用一个字节,汉字通常是3个字节。如果你要传输的文件包含大量英文,使用UTF-8 就可以节省空间。
搞清楚了 ASCII、Unicode 和 UTF-8 的关系,我们就可以总结一下现在
计算机系统通用的字符编码工作方式:在计算机内存中,统一使用 Unicode 编码,当需要保存到硬盘或者需要传输时就采用UTF-8编码。这就意味着你用记事本编辑时,从文件读取的 UTF-8 字符被转换为 Unicode 字符 到内存里,编辑完成后,保存的时候再把 Unicode 转换为 UTF-8 保存到文件。浏览网页的时候,服务器会把动态生成的Unicode内容转化为UTF-8再传输到浏览器解析。
以上内容参考:
廖雪峰的Python3
https://zhidao.baidu.com/question/1047887004693001899.html?device=mobile&ssid=0&from=1086k&uid=0&pu=usm@1,sz@1320_1002,ta@iphone_2_5.1_2_12137.1&bd_page_type=1&baiduid=E507326C90B25CEBB70C15DAA4C58DE3&tj=wenda_abstract_1_0_10_title