上文-常见的编码集讲到了常见的编码集,本文讲述的是文件编码之间的恩怨纠葛,可以说是上文的延伸。
其实要想理解文件编码,还要将其与系统编码,编译器编码做对比,这样更容易理解。
环境:centos7+Python3.5
系统编码:常见的系统有Windows和Linux系统,Windows的默认编码是GBK,Linux的视情况而定,有可能是UTF-8, 也有可能是ASCII。
>>> import locale
>>> locale.getdefaultlocale() # windows下是cp936
('en_US', 'UTF-8')
编译器编码:在这里指Python编译器的编码
>>> import sys
>>> sys.getdefaultencoding()
'utf-8'
文件编码:如果没指定默认使用系统编码
with open("utf.txt","w",encoding = "utf-8") as f: # 指定了utf-8编码
f.write(s)
Python文件编码声明:
我们经常在Python文件开头声明: # coding: utf-8, 这是什么意思呢?这其实是告诉编译器用什么编码去解码, 所以这个解码要与你编码一致,不然就会报错。
UnicodeDecodeError 报错复现:
>>> s = '联通'.encode('gbk')
>>> s.decode('utf-8') # 用哪个解码显示哪个报错
Traceback (most recent call last):
File "<stdin&", line 1, in <module&
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc1 in position 0: invalid start byte
网友评论