1. 为什么Python print会遇到编码错误?
第一次在Windows上运行Python脚本打印中文时,看到红色的UnicodeEncodeError报错,我整个人都是懵的。错误信息里那个神秘的"\u2022"字符,还有"gbk codec can't encode"的提示,就像突然出现的程序世界里的外星语言。后来才发现,这其实是Python在文本处理中最经典的编码问题之一。
这个问题通常发生在Windows系统上,当你尝试打印包含非ASCII字符(比如中文、emoji或特殊符号)的字符串时。错误的核心在于:Python解释器试图用GBK编码来输出文本,但遇到的字符超出了GBK字符集的表示范围。GBK是我国制定的汉字编码标准,但它只能表示约2万多个汉字和符号,而Unicode字符集则包含超过14万个字符。
举个例子,如果你在脚本里写:
python复制print("• 这是一个测试")
在Windows的cmd终端里运行,大概率会看到这样的错误:
code复制UnicodeEncodeError: 'gbk' codec can't encode character '\u2022' in position 0: illegal multibyte sequence
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 系统编码环境深度解析
2.1 Windows控制台的编码陷阱
Windows的cmd终端默认使用GBK编码,这是问题的根源所在。我曾在三个不同版本的Windows(Win7、Win10、Win11)上测试过,发现它们默认都是GBK编码。你可以通过chcp命令查看当前代码页:
cmd复制chcp
输出如果是936,就表示当前使用GBK编码。
有趣的是,如果你用PowerShell或现代终端如Windows Terminal,情况会有所不同。这些终端默认使用UTF-8编码,所以同样的Python脚本可能就不会报错。这种不一致性正是跨平台开发时的噩梦。
2.2 Python的编码决策链
当Python执行print语句时,编码选择遵循这样的顺序:
- 首先检查PYTHONIOENCODING环境变量
- 然后查看标准输出的编码(sys.stdout.encoding)
- 最后回退到系统默认编码(locale.getp
