字符编码是个很大的概念,网上有很多讲解,但有个容易忽略的点,这里补充一下:
是以什么编码存和以什么编码读,是不一样的
从一个小问题出发:
以windows记事本为例,在记事本输入“联通”两个字,以ANSI编码保存,关闭再打开,就变成了乱码
原因:
事实上,我们的记事本指定以什么编码存储文件之后,就直接转换成对应的二进制数保存在文件中,并没有一个内置信息说明该文件是以什么编码存储的,这就导致下次再打开时,根本不知道上次保存是什么编码保存到,并没有记录,只能计算机自己去认这些内容的二进制数据,再来“猜”它是什么编码。
而“联通”这两个字的ANSI编码(在中国大陆是gbk编码),刚好长得很像uft-8的编码,所以计算机猜成了utf-8的编码,解码按照uft-8来解码,导致了乱码。
python2中,为了避免像记事本这种“存的时候知道以什么编码存,但读的时候不知道以什么编码读”这种问题,所以需要手动指定读编码的格式
比如 # -*- coding: utf-8 -*- ,若不指定,则python2默认以ASCII码读,python3默认以utf-8编码来读(此处说的以什么方式读,指的读代码的源文件,因为代码也是一种文本,需要指定编码方式)
如果是对文件操作,例如读一个文件 f = open('file', 'r', encoding='utf-8') ,指的是用uft-8来读这个文件。 注意的是,这里的encoding和# -*- coding: utf-8 -*-完全是两个东西,它们功能不同,一个指定文件编码,一个指定代码的编码,是不同东西不要弄混了