Windows的System Locale编码

2025-07-26

背景

我之前编写了一个python程序,旨在统计我每日的时间损耗 但因为重装系统的缘故,这次程序启动失败了,日志指向奇怪的编码错误

一、’charmap’ codec can’t encode

UnicodeEncodeError: 'charmap' codec can't encode...,错误指向 cp1252 代码页

我尝试了一些常规解决方案

  1. .bat 中使用 chcp 65001
  2. 使用 python -X utf8 启动脚本
  3. 设置 PYTHONUTF8=1 环境变量

错误依旧指向 cp1252。经过查询,我得知cp1252(Windows-1252) 是一个在西方Windows系统中常用的单字节字符编码(代码页),而它不支持中文

  1. 字符集 (Character Set):这是一组字符的集合,例如拉丁字母、数字、标点符号等。如:ASCII字符集包含了英文字母、数字和一些符号
  2. 代码页 (Code Page):这是一个特定于旧版Windows系统(以及DOS等)的概念。它是一张表格,将从0到255(或更多)的数字映射到特定的字符。一个代码页既定义了字符集也定义了这些字符的编码方式。简单来说,它是一种特定的字符编码实现,特别是在非Unicode时代,用于处理不同语言的字符

二、系统区域设置 (System Locale)

问题出在我重装系统时,为了确保清洗原本的系统配置,选择了英语作为初始安装语言。导致了系统区域设置英语(美国),而其默认代码页是 cp1252

Windows 中系统显示的语言与区域设置的语言需要单独设定。经过查阅,我得知:

  • 显示语言:仅影响界面的显示语言,如菜单、按钮文字
  • 系统区域设置 (System Locale):也叫“非 Unicode 程序的语言”。它为系统中所有不明确声明自身编码的程序,提供一个默认的代码页 (Code Page)

三、解决方案:修改系统默认编码

查阅相关资料,有两种解决方式:

a、用全局 UTF-8

这是 Windows 10/11 提供的根本性解决方案

  1. 打开 控制面板区域
  2. 切换到 管理 选项卡
  3. 点击 更改系统区域设置…
  4. 勾选 “Beta: 使用 Unicode UTF-8 提供全球语言支持”
  5. 重启电脑

b、修改为中文区域设置

  1. 打开 控制面板区域
  2. 切换到 管理 选项卡
  3. 点击 更改系统区域设置…
  4. 将“当前系统区域设置”改为 “中文(简体, 中国)”
  5. 重启电脑

默认代码页将从 cp1252 改为 cp936 (GBK)

总结

  1. 被忽视的系统级编码:系统区域设置 (System Locale)设定了windows底层的编码格式
  2. 罕见的思维盲区:安装Git这类开发者工具时,用户会得到明确的警示,关于修改默认选项的后果,因为其假设使用者是专业人士;而Windows的设计理念是“开箱即用”,它隐藏许多的底层配置,这对于普通用户是友好的,但对于开发者而言,反而容易产生思维盲区