本文参考了https://blog.****.net/mingyuli/article/details/79737634
主要的编码方式有两个:
(1)unicode编码: 用十六位二进制数表示一个字符
(2) utf-8: A用01000001表示,用两个八位存储中文。
输出的结果中出现乱码原因:
计算机只能处理0和1两个数字,所以想要处理文本,必须把文本变成0和1这样的数字,最早的计算机使用八个0和1表示一个字节,所以最大能够表示整数是255=11111111.如果想要表示更大的数,必须使用更多的字节。
由于计算机是美国人发明的,所以最早只有127个字符被编写进计算机,即常见的阿拉伯数字,字母大小写,以及键盘上的符号。此编码被称为ASCII编码,比如大写字母A的ASCII编码是65,65再被转换二进制01000001,即是计算机处理的东西。
显然,ASCII不能表示中文,故中国制定了自己的GB2312编码,并且兼容ASCII编码。问题是:使用GB2312编码的慕课网三个字,假设编码为61,62,63.但在ASCII码表可能是其他字符。如下图示,日文中的616263编码成其他字符,打开后意思出错。
解决方法:国际上的unicode编码,整合全世界所有编码。故unicode编码的内容在任一台计算机用unicode仍正常打开
又对于A,ASCII编码为01000001,Unicode编码:0000000001000001此时浪费空间
故出现UTF-8编码:01000001此时用两个八位存储中文。
(2)、记事本使用unicode编码,将记事本存到计算机时,将转化为utf-8储存。
在计算机中打开文本时,将转化为unicode编码
存储原因:使用utf-8储存节省空间,使用unicode打开保证最大的兼容
(3)、服务器读取uncode编码的文档,转化为utf-8格式传给浏览器。因为网络带宽昂贵,转化为了减少负担。
(4)、python3字符串默认使用Unicode编码,所以python3支持多种语言
以Unicode表示的str通过encode()方法可以编码为指定的bytes
如果bytes使用ASCII编码,遇到ASCII码表没有的字符会以\x##表示,此时只用‘\x##’.decode(‘utf-8’)即可
(5)、解决方法
print(f.read().decode(“utf-8”))