背景
我之前编写了一个python程序,旨在统计我每日的时间损耗 但因为重装系统的缘故,这次程序启动失败了,日志指向奇怪的编码错误
一、’charmap’ codec can’t encode
UnicodeEncodeError: 'charmap' codec can't encode...
,错误指向 cp1252
代码页
我尝试了一些常规解决方案
- 在
.bat
中使用chcp 65001
- 使用
python -X utf8
启动脚本 - 设置
PYTHONUTF8=1
环境变量
错误依旧指向 cp1252
。经过查询,我得知cp1252
(Windows-1252) 是一个在西方Windows系统中常用的单字节字符编码(代码页),而它不支持中文
- 字符集 (Character Set):这是一组字符的集合,例如拉丁字母、数字、标点符号等。如:ASCII字符集包含了英文字母、数字和一些符号
- 代码页 (Code Page):这是一个特定于旧版Windows系统(以及DOS等)的概念。它是一张表格,将从0到255(或更多)的数字映射到特定的字符。一个代码页既定义了字符集,也定义了这些字符的编码方式。简单来说,它是一种特定的字符编码实现,特别是在非Unicode时代,用于处理不同语言的字符
二、系统区域设置 (System Locale)
问题出在我重装系统时,为了确保清洗原本的系统配置,选择了英语作为初始安装语言。导致了系统区域设置是英语(美国),而其默认代码页是 cp1252
Windows 中系统显示的语言与区域设置的语言需要单独设定。经过查阅,我得知:
- 显示语言:仅影响界面的显示语言,如菜单、按钮文字
- 系统区域设置 (System Locale):也叫“非 Unicode 程序的语言”。它为系统中所有不明确声明自身编码的程序,提供一个默认的代码页 (Code Page)
三、解决方案:修改系统默认编码
查阅相关资料,有两种解决方式:
a、用全局 UTF-8
这是 Windows 10/11 提供的根本性解决方案
- 打开 控制面板 → 区域
- 切换到 管理 选项卡
- 点击 更改系统区域设置…
- 勾选 “Beta: 使用 Unicode UTF-8 提供全球语言支持”。
- 重启电脑
b、修改为中文区域设置
- 打开 控制面板 → 区域
- 切换到 管理 选项卡
- 点击 更改系统区域设置…
- 将“当前系统区域设置”改为 “中文(简体, 中国)”
- 重启电脑
默认代码页将从 cp1252
改为 cp936 (GBK)
总结
- 被忽视的系统级编码:系统区域设置 (System Locale)设定了windows底层的编码格式
- 罕见的思维盲区:安装Git这类开发者工具时,用户会得到明确的警示,关于修改默认选项的后果,因为其假设使用者是专业人士;而Windows的设计理念是“开箱即用”,它隐藏许多的底层配置,这对于普通用户是友好的,但对于开发者而言,反而容易产生思维盲区