笔者使用的操作系统为windows 7,python解释器版为python3.7,pycharm版本为pycharm2018.3
如无特殊说明,代码均在此环境执行


本文主要是针对以下两个问题进行的验证

  1. sys.stdout.encoding是否就是控制台的编码(代码页)?
  2. 配置环境变量PYTHONIOENCODING之后,sys.stdout.encoding就会取该值?

测试环境1—— CMD命令行窗口

笔者window7系统,故以cmd命令行窗口测试

Situation 1
未配置环境变量PYTHONIOENCODING

在没有配置环境变量的情况下,输出当前sys.stdout.encoding的值
在这里插入图片描述
当前控制台活动代码页为936,对应编码为GBK
python2与控制台一致cp936,python3则是utf-8
 

Situation 2
配置环境变量PYTHONIOENCODING(命令行方式)

在这里插入图片描述
通过命令行,添加环境变量

set PYTHONIOENCODING=ascii

添加环境变量后,
python2不再与控制台一致,而是获取了环境变量的值,
python3则依然是utf-8

  • 注:
    这种方式只是暂时性的修改环境变量,窗口关闭后就会失效,所以下一步,就是尝试一劳永逸的方式

 

Situation 3
配置环境变量PYTHONIOENCODING(界面窗体中添加)

右键 我的电脑 → 高级系统配置 → 环境变量
在这里插入图片描述
重新打开命令行窗口,执行之前的的操作
在这里插入图片描述
结果一样
python2直接获取环境变量的值ascii,
python3则是utf-8
 

结论:

在python2中
没有配置环境变量PYTHONIOENCODING的情况下,sys.stdout.encoding某种意义上(猜测)就是当前环境下活动代码页的值,配置环境后,则为环境变量的值
在python3中
sys.stdout.encoding不再是当前环境下活动代码页的值,只表示标准输出的编码,具体的机制未知,
猜测 可能是内部虚拟了一个终端,或者临时修改了控制台的代码页之类,而且此时终端的编码必须是utf-8,否则直接打印应该会报错或者出现乱码

print过程演示
(由于对于python3输出终端不太了解,只能以代码模拟终端非utf-8编码的情况)

>>> '百度一下'.encode('utf-8').decode('gbk')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'gbk' codec can't decode byte 0x80 
in position 8: illegal multibyte sequence

>>> '百度一下'.encode('utf-8').decode('gbk','ignore')
'鐧惧害涓涓'
>>>
Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐