问题的根源在于 编码不一致,就是你的 Python 脚本文件、Python 解释器、以及你的终端(命令行窗口)这三者对“中文字符应该用什么方式表示”这件事没有达成共识。

下面我将从 原因分析 到 解决方案,再到 最佳实践,为你详细讲解。
问题根源:编码不一致
想象一下,中文“中”这个字,在不同的“方言”(编码)里有不同的名字。
- UTF-8:像普通话,是国际通用的标准,能表示世界上几乎所有的字符。
- GBK / GB2312:像某个地方的方言,是中国早期常用的编码,能表示大部分常用汉字,但不包含所有字符。
当你的 Python 脚本用 UTF-8 编写了“中”字,但终端却用 GBK 的“方言”去读它时,终端就会看到一个它不认识的“怪符号”,这就是乱码。
解决方案(按推荐顺序)
为 Python 脚本指定编码(最推荐、最规范)
这是解决乱码问题的根本方法,通过在 Python 文件的最顶部添加一行“魔法注释”,明确告诉 Python 解释器:这个文件是用什么编码格式保存的。
步骤:
-
确保你的代码编辑器(如 VS Code, PyCharm, Sublime Text)保存文件时使用了 UTF-8 编码。 这通常是其默认设置。
-
在你的
.py文件的第一行或第二行添加以下注释:# -*- coding: utf-8 -*- # 或者更现代的写法 # coding=utf-8
示例代码 (test_print.py):
# -*- coding: utf-8 -*-
print("你好,世界!")
print("This is a test: 中文")
为什么这是最佳方案?
- 兼容性好:无论你在什么操作系统(Windows, macOS, Linux)上运行,或者在哪个终端里运行,只要 Python 解释器能正确读取这个声明,它就能正确解码文件内容。
- 可移植性强:你的代码文件是自包含的,不依赖于运行环境的特定配置。
临时修改终端的编码(适用于 Windows 快速排查)
如果你无法修改源代码(运行别人的代码),或者想快速在当前终端窗口解决问题,可以手动修改终端的编码。
对于 Windows 用户:
-
打开命令提示符 或 PowerShell。
-
在运行你的 Python 脚本之前,输入以下命令:
chcp 65001
65001UTF-8 编码的代号。 -
然后再运行你的 Python 脚本:
python your_script.py
注意:
- 这个设置只对当前的终端窗口有效,关闭窗口后就会失效。
- 修改后,终端的字体可能会显示异常,可以尝试将终端字体改为 "Consolas" 或 "Lucida Console" 等支持 Unicode 的字体。
设置环境变量(一劳永逸,但不推荐初学者)
你可以设置一个系统环境变量 PYTHONIOENCODING,强制 Python 解释器在标准输入、输出和错误流中使用指定的编码。
对于 Windows 用户:
- 在 Windows 搜索框中搜索“编辑系统环境变量”并打开。
- 点击“环境变量...”按钮。
- 在“系统变量”区域,点击“新建...”。
- 变量名:
PYTHONIOENCODING - 变量值:
utf-8 - 确定所有对话框,然后重启你的终端和 IDE,让设置生效。
对于 Linux / macOS 用户:
在你的 shell 配置文件(如 ~/.bashrc, ~/.zshrc)中添加一行:
export PYTHONIOENCODING=utf-8
source 该文件(source ~/.bashrc)。
为什么不推荐? 这会全局改变 Python 的行为,可能会影响到那些依赖默认编码(通常是系统 locale)的其他程序或库,可能引发新的、更隐蔽的问题。方案一更精确、更安全。
常见场景与最佳实践
场景1:在 IDE(如 VS Code, PyCharm)中运行
这是最常见的情况,乱码通常不是因为 IDE 本身,而是因为集成终端的编码设置。
-
VS Code:
- 确保 VS Code 的文件编码设置为 UTF-8(通常默认就是)。
- 打开集成终端(
Ctrl +` `)。 - 右键点击终端标签页,选择“配置文件文件” (Profiles) -> “终端” (Terminal) -> “默认” (Default)。
- 在设置中搜索 "encoding",确保
terminal.integrated.defaultProfile.windows(Windows) 或terminal.integrated.defaultProfile.osx(macOS) 的配置项指向一个使用 UTF-8 的终端。 - 终极解决方案:在 VS Code 的
settings.json中添加以下设置,强制所有终端使用 UTF-8:"terminal.integrated.profiles.windows": { "PowerShell": { "source": "PowerShell", "icon": "terminal-powershell", "args": ["-NoExit", "-Command", "chcp 65001"] } }, "terminal.integrated.defaultProfile.windows": "PowerShell"这会让每次打开 PowerShell 终端时都自动切换到 UTF-8。
-
PyCharm:
- PyCharm 默认对 UTF-8 支持很好。
- 确保你的项目编码设置是 UTF-:
File->Settings->Editor->File Encodings,将Project Encoding和IDE Encoding都设置为UTF-8。 - 确保运行/调试配置中的
--command-line-options没有干扰编码的参数。
场景2:在命令行(CMD/PowerShell)中直接运行
- 首选方案:使用 方案一,在代码顶部加
# -*- coding: utf-8 -*-。 - 临时方案:使用 方案二,运行
chcp 65001。
场景3:将中文输出到文件
如果你把打印结果重定向到一个文件,也可能出现乱码,因为文件本身也有编码。
# -*- coding: utf-8 -*-
with open('output.txt', 'w', encoding='utf-8') as f:
print("你好,世界!", file=f)
关键点在于 open() 函数的 encoding='utf-8' 参数,它明确告诉 Python 以 UTF-8 格式写入文件,如果不指定,它会使用系统的默认编码,在 Windows 上很可能是 GBK,导致文件内容乱码。
| 方案 | 优点 | 缺点 | 推荐度 |
|---|---|---|---|
在代码顶部加 # -*- coding: utf-8 -*- |
规范、可移植、一劳永逸 | 无明显缺点 | ★★★★★ (强烈推荐) |
终端执行 chcp 65001 |
快速、无需修改代码 | 临时性、依赖终端设置 | ★★★☆☆ (临时调试用) |
设置环境变量 PYTHONIOENCODING |
全局生效 | 可能影响其他程序,不够精确 | ★★☆☆☆ (不推荐,除非特殊需求) |
给你的最终建议:
养成在每一个新 Python 文件顶部都加上 # -*- coding: utf-8 -*- 的好习惯。 这能从源头上解决 99% 的中文乱码问题,让你的代码在任何地方都能正确运行。
