软件测试学习 之 Python 环境变量PYTHONIOENCODING 与 sys.stdout.encoding
·
笔者使用的操作系统为
windows 7,python解释器版为python3.7,pycharm版本为pycharm2018.3
如无特殊说明,代码均在此环境执行
文章目录
本文主要是针对以下两个问题进行的验证
sys.stdout.encoding是否就是控制台的编码(代码页)?- 配置环境变量
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')
'鐧惧害涓涓'
>>>
更多推荐
所有评论(0)