You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 11:47:24