解决Python print在Windows控制台显示中文乱码的问题

Elena
Elena
发布时间:2026-10-28| 9人浏览过
原创

深入分析Windows控制台运行Python时print中文出现乱码或UnicodeEncodeError的原因,并提供控制台代码页切换、环境变量配置、Python UTF-8 Mode及代码层重配置等针对性解决步骤与验证方法。

在 Windows 环境下使用命令提示符(CMD)或旧版 PowerShell 运行 Python 脚本时,print() 输出中文字符串常常会出现显示为乱码(如出现问号、错位拼合字符)或者直接抛出 UnicodeEncodeError: 'gbk' codec can't encode character... 的异常。这一现象的核心原因在于 Python 标准输出流协商的字符编码与 Windows 控制台当前活动代码页(Code Page)存在冲突。本文将清晰拆解控制台的编码链路,提供控制台切换、环境变量配置、启动参数指定以及脚本级兼容四种切实可行的解决办法,并附带环境自检与排查指引。

一、控制台中文输出异常的根本原因

在 Python 3 中,内存中的字符串(str)统一使用 Unicode 编码表示。当调用 print() 输出文字时,Python 必须将 Unicode 字符编码为具体的字节序列,再传送给操作系统的标准输出句柄(sys.stdout)。

在 Linux 和 macOS 等类 Unix 系统中,系统全局语言环境(Locale)与终端默认均采用 UTF-8 编码,整个传输与解码过程天然契合。但在简体中文版 Windows 系统中,传统的命令提示符(CMD)默认代码页为 936(对应微软的 GBK 编码扩展)。此时数据传输会出现以下两种经典冲突:

  • 字符超出范围导致报错中止:当 Python 按照控制台推荐的 GBK 编码进行输出时,若文本中包含 GBK 字符集未收录的文字(如特殊标点、部分生僻字、特定数学符号或 Emoji 表情),Python 的编码器就会抛出 UnicodeEncodeError。
  • 编解码协议不一致导致文字乱码:若 Python 按照 UTF-8 格式输出多字节序列,而 Windows 控制台仍使用 GBK 规则每两个字节强行拼接解释,就会显示出完全无法识别的拼凑乱码;反之若字体不支持特定字形,则会呈现为白色方块或问号。
解决Python print在Windows控制台显示中文乱码的问题
图 1:Python 文本输出与 Windows 控制台接收解码全链路

二、方法一:修改控制台活动代码页为 UTF-8

这是最直接的操作方式。通过将 Windows 命令提示符的代码页临时切换为 65001(即 UTF-8 代码页),让控制台本身以 UTF-8 规则来解析来自 Python 的字节序列。

1. 临时切换代码页(当前窗口生效)

在打开 CMD 或 PowerShell 窗口后,在运行 Python 脚本之前执行以下命令:

chcp 65001

执行后终端会提示:Active code page: 65001。随后再运行 Python 脚本:

python your_script.py

此时 Python 启动时检测到控制台代码页为 65001,其 sys.stdout.encoding 会自动匹配为 utf-8,中文及特殊符号即可正常打印。

2. 检查并调整控制台字体

部分老旧版本的 CMD 窗口在切换到 65001 后,若仍使用默认的“点阵字体”,可能会导致英文字符重叠或中文字符显示为空白。可通过以下步骤调整:

  1. 鼠标右键点击 CMD 窗口顶部标题栏,选择“属性”。
  2. 切换到“字体”选项卡。
  3. 将字体从“点阵字体”更改为“Consolas”、“新宋体”或“Cascadia Mono”。
  4. 点击“确定”保存设置。
解决Python print在Windows控制台显示中文乱码的问题
图 2:控制台代码页排查与适配操作流程

三、方法二:配置 Python 环境变量与 UTF-8 Mode

如果希望在不手动每次执行 chcp 65001 的情况下正常输出中文,可以通过 Python 官方提供的运行控制机制来完成。

1. 设置 PYTHONIOENCODING 环境变量

环境变量 PYTHONIOENCODING 专门用于覆盖标准输入、标准输出和标准错误(stdin/stdout/stderr)的默认编码格式。

单次运行生效(CMD):

set PYTHONIOENCODING=utf-8 && python your_script.py

单次运行生效(PowerShell):

$env:PYTHONIOENCODING="utf-8"; python your_script.py

Windows 系统中永久配置:

  1. 按 Win + R 键,输入 sysdm.cpl 并回车,打开“系统属性”。
  2. 进入“高级”选项卡,点击下方的“环境变量”。
  3. 在“用户变量”或“系统变量”中点击“新建”。
  4. 变量名填写 PYTHONIOENCODING,变量值填写 utf-8。
  5. 连续点击“确定”保存。重新启动控制台后即可全局生效。

2. 使用 Python 3.7+ 的 UTF-8 模式(PEP 540)

从 Python 3.7 开始,引入了标准 UTF-8 Mode。启用后,无论当前 Windows 的区域设置和代码页是什么,Python 都会强制将 utf-8 作为默认编码,并将 sys.stdout 的错误处理机制设为 surrogateescape。

启用方式非常简便,只需在启动脚本时附加 -X utf8 参数:

python -X utf8 your_script.py

也可以通过设置环境变量 PYTHONUTF8=1 让所有 Python 进程默认开启该模式。

四、方法三:在 Python 脚本中实现编码自适配

当编写需要分发给其他用户或在不同机器上部署的独立脚本时,往往无法预先要求使用者的控制台已经配置好环境变量。此时在 Python 代码入口处直接重置输出流编码是最稳妥的做法。

1. 使用 sys.stdout.reconfigure()(推荐,Python 3.7+)

在脚本的最开头对 sys.stdout 和 sys.stderr 执行重新配置,强制指定编码为 utf-8:

import sys

# 仅在标准输出支持 reconfigure 时生效(针对 Python 3.7+)
if hasattr(sys.stdout, 'reconfigure'):
    sys.stdout.reconfigure(encoding='utf-8')
    sys.stderr.reconfigure(encoding='utf-8')

print("测试中文输出:你好,世界!")
print("测试特殊符号与Emoji:★ ⚑ 💡")

2. 针对旧版 Python 的兼容包装方法(io.TextIOWrapper)

如果运行环境低于 Python 3.7,可以通过 io.TextIOWrapper 重新包装底层二进制流(buffer):

import sys
import io

# 重新包装 stdout 的底层缓冲字节流
if sys.platform.startswith('win'):
    sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8', errors='replace')
    sys.stderr = io.TextIOWrapper(sys.stderr.buffer, encoding='utf-8', errors='replace')

print("旧版本兼容模式下的中文输出正常")
关于 errors 参数的选择

在重构输出流时,可指定 errors='replace' 或 errors='backslashreplace'。这样即使遇到控制台当前字体绝对无法渲染的非常规字符,Python 也会将其自动替换为问号或反斜杠转义序列,从而确保整个主程序不会因为日志打印而中断退出。

解决Python print在Windows控制台显示中文乱码的问题
图 3:四种解决方式的技术特性与适用场景横向对比

五、特殊场景:管道重定向与 IDE 内置控制台

1. 重定向输出到文件时的编码陷阱

很多开发者在控制台中直接打印测试正常,但当执行重定向命令时却遭遇报错:

python script.py > output.log

原因解释:当 print() 输出直接连接到物理控制台窗口时,Python 会读取控制台句柄的编码属性;但一旦通过 > 管道重定向到文件,Python 认为目标是一个标准文件流,此时 sys.stdout.encoding 不再参考控制台代码页,而是回退到操作系统的默认 ANSI 区域编码(在中文 Windows 上即 GBK)。因此写入文件时依旧会触发 UnicodeEncodeError。

针对性方案:在此类重定向场景下,必须显式使用 PYTHONIOENCODING=utf-8 或在命令中添加 -X utf8,例如:

python -X utf8 script.py > output.log

2. VS Code / PyCharm 终端表现差异

在集成开发环境(IDE)中:

  • VS Code 集成终端:默认使用的是系统 PowerShell 或 CMD,但在其内部已被封装为基于 xterm.js 的前端渲染器,通常已较好支持 UTF-8。若仍乱码,可在 VS Code 设置中搜索 terminal.integrated.detectLocale 并确保其开启。
  • PyCharm Run 控制台:PyCharm 会接管进程的 I/O。可在 Settings -> Editor -> General -> Console 中将 Console Encoding 设置为 UTF-8。

六、自检脚本与排查决策树

在排查乱码问题时,建议先运行以下单行自检代码,明确当前环境的实际编码参数:

import sys
import locale

print("1. 控制台标准输出编码 sys.stdout.encoding :", sys.stdout.encoding)
print("2. 默认文件系统编码 sys.getfilesystemencoding():", sys.getfilesystemencoding())
print("3. 本地化首选编码 locale.getpreferredencoding():", locale.getpreferredencoding())
print("4. 中文字符串打印验证 :", "你好,世界!这是一段中文测试。")

运行该脚本后,若输出结果中的 sys.stdout.encoding 明确显示为 utf-8,且第 4 项中文字符清晰可读,说明当前运行环境的字符通路已完全打通。

解决Python print在Windows控制台显示中文乱码的问题
图 4:Python 控制台中文乱码排查与解决方案决策树

七、总结与最佳实践

处理 Windows 控制台中 Python print() 中文乱码的核心原则是“对齐输入流与输出流的字符编码规范”。在实际开发与部署中,建议根据使用场景采取分层策略:

  • 日常本地开发调试:推荐在 Windows 10/11 中安装并使用 Windows Terminal 替代老旧的 CMD 窗口,配合 PowerShell 7,能从根本上消除代码页和字形渲染造成的显示障碍。若仍需在原生 CMD 中运行,先执行一次 chcp 65001 即可。
  • 独立脚本与工具分发:在 Python 3 脚本的入口文件首部添加 sys.stdout.reconfigure(encoding='utf-8'),无需依赖最终用户的本地系统配置即可实现开箱即用。
  • 批处理脚本与 CI/CD 自动化:在启动脚本前统一声明 PYTHONIOENCODING=utf-8,保证即便输出被重定向至磁盘日志文件,也不会因为编码回退而引发异常崩溃。

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。