
本文详解如何解决 Python 中因编码不匹配导致的 UnicodeEncodeError 错误,重点针对使用 csv.DictWriter 写入含 Unicode 字符(如 č)时触发 'charmap' codec can't encode character 的典型问题,并提供安全、兼容性强的 UTF-8 编码实践方案。
本文详解如何解决 python 中因编码不匹配导致的 `unicodeencodeerror` 错误,重点针对使用 `csv.dictwriter` 写入含 unicode 字符(如 `č`)时触发 `'charmap' codec can't encode character` 的典型问题,并提供安全、兼容性强的 utf-8 编码实践方案。
在处理含国际化字符(如捷克语 pečnostní informační služba 中的 č、š、í)的 CSV 数据时,常见错误如下:
UnicodeEncodeError: 'charmap' codec can't encode character '\u010d' in position 69: character maps to <undefined></undefined>
该错误本质是:Windows 默认文本编码 cp1252 不支持某些 Unicode 字符(如 U+010D č),而 Python 在未显式指定 encoding 时,open(..., 'w') 会回退至系统默认编码(Windows 下常为 cp1252),导致写入失败。
✅ 正确做法是统一显式指定 UTF-8 编码——它能完整覆盖所有 Unicode 字符,且是现代数据交换的事实标准:
快速生成专业的 Python 脚本和应用代码。一键创建完整项目结构,支持CLI、API、爬虫、Bot、Django等多种项目类型,包含完整的项目结构、配置文件、依赖管理、测试、README和文档。
import csv
input_file = "input.tsv"
output_file = "output.csv"
with open(input_file, encoding='utf-8-sig') as f_input, \
open(output_file, 'w', newline='', encoding='utf-8') as f_output:
reader = csv.DictReader(f_input, delimiter='\t')
writer = csv.DictWriter(f_output, fieldnames=reader.fieldnames)
writer.writeheader()
for row in reader:
print(row) # {'id': '123', 'name': 'pečnostní informační služba'}
writer.writerow(row)
? 关键注意事项:
- ✅ encoding='utf-8' 必须显式添加到 open(output_file, 'w', ...) 中;
- ✅ newline='' 是 csv.writer 的强制要求(避免 Windows 下空行);
- ✅ 输入文件若含 BOM(如 Excel 保存的 UTF-8),使用 encoding='utf-8-sig' 可自动剥离 BOM;
- ⚠️ 避免使用 errors='ignore' 或 errors='replace'(如 encoding='cp1252', errors='ignore'),虽可绕过错误,但会静默丢失/损坏数据,仅作临时调试用;
- ? 验证输出:用支持 UTF-8 的编辑器(如 VS Code、Notepad++)打开 output.csv,确认 č 等字符显示正常。
总结:始终对读写操作显式声明编码,输入用 utf-8-sig(兼容 BOM),输出用 utf-8,并配合 newline='' 使用 CSV 模块——这是处理多语言 CSV 数据最健壮、可移植的实践。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










