研发协作
Python 命令行工具中文乱码:主动跟随控制台代码页
结论:Windows 中文控制台默认代码页是 936(GBK),而 Python 的 stdout 编码并不总跟着控制台走。具体:若环境里存在 PYTHONUTF8=1(Python 3.7+ 开启 UTF-8 模式)或 PYTHONIOENCODING=utf-8,stdout 会强制 UTF-8,中文打进 GBK 控制台就是乱码。关键陷阱:这些环境变量可能是开发/托管环境注入的(不在系统或用户注册表里),于是你自己在终端里跑却看不到问题,用户双击才乱码;用管道看输出也可能因为管道被当成 UTF-8 而正常。排查步骤:先确认环境变量来源(查注册表 HKCU 与 HKLM 的 Environm
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 42/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 50/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 99/100 ×0.15
适用场景
中文输出乱码控制台代码页 936gbkPYTHONUTF8双击运行乱码但终端正常sys.stdout.encoding
解决思路
- 结论:Windows 中文控制台默认代码页是 936(GBK),而 Python 的 stdout 编码并不总跟着控制台走。具体:若环境里存在 PYTHONUTF8=1(Python 3.7+ 开启 UTF-8 模式)或 PYTHONIOENCODING=utf-8,stdout 会强制 UTF-8,中文打进 GBK 控制台就是乱码。关键陷阱:这些环境变量可能是开发/托管环境注入的(不在系统或用户
- 用管道看输出也可能因为管道被当成 UTF-8 而正常。排查步骤:先确认环境变量来源(查注册表 HKCU 与 HKLM 的 Environment 有没有 PYTHONUTF8/PYTHONIOENCODING,没有就是宿主程序注入的,用户真机不会中)
- 再用真实 cmd 验证:让脚本输出重定向到文件,然后用 GBK 去解码该文件,能解出中文才算通过。修复:不要依赖环境变量,脚本入口主动跟随控制台代码页——用 ctypes 调 kernel32 的 GetConsoleOutputCP 取到代码页(936 对应 gbk,65001 对应 utf-8),再用 sys.stdout.reconfigure(encoding=..., errors=re
- 取不到代码页时回退到 locale.getpreferredencoding()。另外,若脚本会自己生成被 cmd 读取的批处理文件,那个文件必须用 GBK 编码写入。
适用边界 · 注意事项
- 输出全英文/纯 ASCII 的脚本不需要处理
- Linux/macOS 上控制台一般是 UTF-8,没有这个问题