python2默认编码为ASCII码

windows默认编码是gbk

python3自动把文件编码转成unicode编码,python2不会自动的把文件编码转成unicode存在内存中,所以需要手动转码。

python3转码执行流程:

  1. 解释器找到代码文件,把代码字符串根据文件头定义的编码加载到内存,转成unicode编码;
  2. 把代码字符串按照语法规则进行解释;
  3. 所有的变量字符都会以unicode编码声明。
  1. graph LR
  2. utf-8 -->decode解码
  3. decode解码 --> unicode
graph LR
unicode -->encode编码
encode编码 --> utf-8,gbk等
a = '编码'                       # a是unicode类型
b = a.encode('utf-8')       # b是utf-8类型
c = a.encode('gbk')        #c是gbk类型
print (a , b ,c)
print (type(a),type(b),type(c))
#python3默认是unicode类型

编码 b'\xe7\xbc\x96\xe7\xa0\x81' b'\xb1\xe0\xc2\xeb'
<class 'str'> <class 'bytes'> <class 'bytes'>

decode解码作用

decode解码是将其他类型的数据编码转换成unicode类型。如:

  • str1.decode(‘gb2312’),表示将gb2312编码的字符串str1解码成unicode编码

encode编码作用

encode编码是将unicode类型的数据编码成其他类型。
如:

  • str2.encode(‘gb2312’),表示将unicode编码的字符串str2转换成gb2312编码

已经知道在python3中,输出的时候,会把str/Unicode 变成utf8的编码;来看一下环境中的输出编码是什么:

import sys
print(sys.stdout.encoding)

-> utf-8

在最新的python 3版本中,字符串的类型是str, 在内存中都是以Unicode表示,一个字符对应若干个字节;
如果要在网络上传输,或者保存到磁盘上,就需要把str变为以字节为单位的bytes。
以Unicode表示的str通过encode()方法可以编码为指定的bytes,例如:

>>> 'ABC'.encode('ascii')
b'ABC'
>>> '中文'.encode('utf-8')
b'\xe4\xb8\xad\xe6\x96\x87'
>>> '中文'.encode('ascii')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)

在操作字符串时,我们经常遇到str和bytes的互相转换。为了避免乱码问题,应当始终坚持使用UTF-8编码对str和bytes进行转换。

确认文件编码方式

可以用 sys.getfilessystemencoding() 返回的文本编码形式进行编码和解码

https://blog.csdn.net/Yaokai_AssultMaster/article/details/82823158?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase