如何可靠获取Python输出编码?sys.stdout.encoding为何不可靠?
为什么
sys.stdout.encoding和print的实际编码行为不一致? 我之前一直笃定sys.stdout.encoding是获取print函数所用编码的权威方式,直到实际跑了测试代码才发现自己错得离谱!
先看这段测试:
>>> import sys >>> hello_in_chinese = '\u4f60\u597d' >>> print(sys.stdout.encoding, hello_in_chinese) cp1252 你好 >>> hello_in_chinese.encode(sys.stdout.encoding) Traceback (most recent call last): File "<pyshell#65>", line 1, in <module> hello_in_chinese.encode(sys.stdout.encoding) UnicodeEncodeError: 'charmap' codec can't encode characters in position 0-1: character maps to <undefined>
是不是很矛盾?print明明能正常输出中文,但用sys.stdout.encoding(这里是cp1252)去编码同一段中文却直接报错了。
核心原因
问题出在print函数的工作机制上:它并不会严格遵循sys.stdout.encoding的设置,而是会直接和操作系统的终端/控制台进行交互。比如在Windows环境下,sys.stdout.encoding可能被Python初始化为cp1252(西欧字符编码),但你的控制台本身可能配置了支持中文的编码(比如GBK或者UTF-8),所以print会绕过Python的编码声明,直接用终端的编码来输出字符,这就导致了能正常显示中文的情况。
而hello_in_chinese.encode(sys.stdout.encoding)是直接用Python声明的编码来处理字符串,cp1252本身不包含中文字符的编码映射,自然会抛出编码错误。
简单总结:sys.stdout.encoding是Python对标准输出流的编码声明,但print的实际编码行为由终端的编码配置决定,二者并不总是一致的。
内容的提问来源于stack exchange,提问作者Mark Ransom
相关产品推荐
相关产品推荐

