2022年 11月 9日

python的默认编码

python2中,默认使用的是ASCII编码。这个编码和开头的encoding不同之处在于,开头的encoding是对于文件内容的编码,默认编码是一些python方法中默认使用的编码。比如对str进行encode的时候默认先decode的编码,比如文件写操作write的encode的编码等。

python3中,默认使用的是UTF-8编码。

sys.getdefaultencoding() 获取默认编码

import sys
print(sys.getdefaultencoding())  
  • 1
  • 2

python2

D:\SoftInstall\Python\Python38\python3.exe E:/PycharmProjects/displayPY3/1.py
ascii

Process finished with exit code 0
  • 1
  • 2
  • 3
  • 4

python3

D:\SoftInstall\Python\Python38\python3.exe E:/PycharmProjects/displayPY3/1.py
utf-8

Process finished with exit code 0
  • 1
  • 2
  • 3
  • 4

sys.setdefaultencoding(编码格式) 修改默认编码

下面这个例子,用python2环境

# coding=utf-8
import sys
print(sys.getdefaultencoding())
reload(sys)
sys.setdefaultencoding('utf-8')
print(sys.getdefaultencoding())
s = '中文'
s.encode('utf-8')
print(s)
#等价于s.decode(“utf-8”).encode('utf8')
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
E:\PycharmProjects\LEDdisplay2\venv\Scripts\python.exe E:/PycharmProjects/LEDdisplay2/2.py
ascii
utf-8
中文
  • 1
  • 2
  • 3
  • 4

如果上述代码没有修改默认编码,就会使用默认编码ASCII来decode变量s,就会报错

# coding=utf-8
import sys
print(sys.getdefaultencoding())
s = '中文'
s.encode('utf-8')
print(s)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
E:\PycharmProjects\LEDdisplay2\venv\Scripts\python.exe E:/PycharmProjects/LEDdisplay2/2.py
ascii
Traceback (most recent call last):
  File "E:/PycharmProjects/LEDdisplay2/2.py", line 5, in <module>
    s.encode('utf-8')
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 0: ordinal not in range(128)

Process finished with exit code 1
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

上述代码为什么需要reload(sys)?请看下面的代码:

# coding=utf-8
import sys
print(sys.getdefaultencoding())
# reload(sys)
sys.setdefaultencoding('utf-8')
print(sys.getdefaultencoding())
s = '中文'
s.encode('utf-8')
print(s)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
E:\PycharmProjects\LEDdisplay2\venv\Scripts\python.exe E:/PycharmProjects/LEDdisplay2/2.py
Traceback (most recent call last):
  File "E:/PycharmProjects/LEDdisplay2/2.py", line 5, in <module>
    sys.setdefaultencoding('utf-8')
AttributeError: 'module' object has no attribute 'setdefaultencoding'
ascii

Process finished with exit code 1
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

reload是用于重新加载之前import的模块。这里需要重新加载sys的原因是:python在加载模块时候删除了sys中的setdefaultencoding方法(可能是出于安全起见),所以需要reload这个sys模块。