Python打印Unicode为何需调整sys.stdout?相关代码疑问解析
Python打印Unicode字符报错与stdout编码修改解析
问题背景
使用requests和BeautifulSoup爬取网页文本后,直接打印包含\u2588字符的内容时,抛出错误:
UnicodeEncodeError: 'charmap' codec can't encode character '\u2588' in position 0: character maps to <undefined>
通过修改stdout编码为UTF-8后恢复正常,现针对以下两个问题进行解答:
1. sys.stdout = codecs.getwriter("utf-8")(sys.stdout.detach())的作用
这段代码的核心是强制把标准输出(stdout)的编码改成UTF-8,拆解细节:
sys.stdout.detach():剥离当前stdout流的编码处理层,返回原始字节流对象,不再自动完成字符串到字节的编码转换。codecs.getwriter("utf-8"):生成一个UTF-8编码的写入器,负责把传入的Unicode字符串编码成UTF-8格式的字节。- 整体赋值:将这个UTF-8编码写入器绑定到sys.stdout,之后所有
print()输出的字符串都会自动转成UTF-8字节再输出,替代了系统默认的终端编码逻辑。
2. 为何Python无法直接打印b'\xe2\x96\x88'对应的字符?
首先明确:b'\xe2\x96\x88'是Unicode字符\u2588(全块▊)的UTF-8编码字节序列。Python无法直接打印该字符的原因是:
- 默认情况下,
print()会用终端的默认编码对字符串编码后输出。比如Windows终端默认编码常为cp1252或GBK,这些编码的字符集里没有\u2588这个特殊符号,找不到对应的编码映射,因此抛出UnicodeEncodeError。 - 直接打印字节对象
b'\xe2\x96\x88'时,Python只是输出字节的字面表示(如b'\xe2\x96\x88'),没有尝试编码转换,所以不会报错,但这并不是我们想要的字符显示效果。
内容的提问来源于stack exchange,提问作者Kun.tito
相关产品推荐
相关产品推荐

