杰瑞科技汇

Python打印中文为何会出现乱码?

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

Python打印中文为何会出现乱码?-图1
(图片来源网络,侵删)

下面我将从 原因分析解决方案,再到 最佳实践,为你详细讲解。


问题根源:编码不一致

想象一下,中文“中”这个字,在不同的“方言”(编码)里有不同的名字。

  • UTF-8:像普通话,是国际通用的标准,能表示世界上几乎所有的字符。
  • GBK / GB2312:像某个地方的方言,是中国早期常用的编码,能表示大部分常用汉字,但不包含所有字符。

当你的 Python 脚本用 UTF-8 编写了“中”字,但终端却用 GBK 的“方言”去读它时,终端就会看到一个它不认识的“怪符号”,这就是乱码。


解决方案(按推荐顺序)

为 Python 脚本指定编码(最推荐、最规范)

这是解决乱码问题的根本方法,通过在 Python 文件的最顶部添加一行“魔法注释”,明确告诉 Python 解释器:这个文件是用什么编码格式保存的。

步骤:

  1. 确保你的代码编辑器(如 VS Code, PyCharm, Sublime Text)保存文件时使用了 UTF-8 编码。 这通常是其默认设置。

  2. 在你的 .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 用户:

  1. 打开命令提示符 或 PowerShell。

  2. 在运行你的 Python 脚本之前,输入以下命令:

    chcp 65001

    65001 UTF-8 编码的代号。

  3. 然后再运行你的 Python 脚本:

    python your_script.py

注意:

  • 这个设置只对当前的终端窗口有效,关闭窗口后就会失效。
  • 修改后,终端的字体可能会显示异常,可以尝试将终端字体改为 "Consolas" 或 "Lucida Console" 等支持 Unicode 的字体。

设置环境变量(一劳永逸,但不推荐初学者)

你可以设置一个系统环境变量 PYTHONIOENCODING,强制 Python 解释器在标准输入、输出和错误流中使用指定的编码。

对于 Windows 用户:

  1. 在 Windows 搜索框中搜索“编辑系统环境变量”并打开。
  2. 点击“环境变量...”按钮。
  3. 在“系统变量”区域,点击“新建...”。
  4. 变量名PYTHONIOENCODING
  5. 变量值utf-8
  6. 确定所有对话框,然后重启你的终端和 IDE,让设置生效。

对于 Linux / macOS 用户:

在你的 shell 配置文件(如 ~/.bashrc, ~/.zshrc)中添加一行:

export PYTHONIOENCODING=utf-8

source 该文件(source ~/.bashrc)。

为什么不推荐? 这会全局改变 Python 的行为,可能会影响到那些依赖默认编码(通常是系统 locale)的其他程序或库,可能引发新的、更隐蔽的问题。方案一更精确、更安全。


常见场景与最佳实践

场景1:在 IDE(如 VS Code, PyCharm)中运行

这是最常见的情况,乱码通常不是因为 IDE 本身,而是因为集成终端的编码设置。

  • VS Code:

    1. 确保 VS Code 的文件编码设置为 UTF-8(通常默认就是)。
    2. 打开集成终端(Ctrl + ` `)。
    3. 右键点击终端标签页,选择“配置文件文件” (Profiles) -> “终端” (Terminal) -> “默认” (Default)。
    4. 在设置中搜索 "encoding",确保 terminal.integrated.defaultProfile.windows (Windows) 或 terminal.integrated.defaultProfile.osx (macOS) 的配置项指向一个使用 UTF-8 的终端。
    5. 终极解决方案:在 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:

    1. PyCharm 默认对 UTF-8 支持很好。
    2. 确保你的项目编码设置是 UTF-:File -> Settings -> Editor -> File Encodings,将 Project EncodingIDE Encoding 都设置为 UTF-8
    3. 确保运行/调试配置中的 --command-line-options 没有干扰编码的参数。

场景2:在命令行(CMD/PowerShell)中直接运行

  1. 首选方案:使用 方案一,在代码顶部加 # -*- coding: utf-8 -*-
  2. 临时方案:使用 方案二,运行 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% 的中文乱码问题,让你的代码在任何地方都能正确运行。

分享:
扫描分享到社交APP
上一篇
下一篇