
本文详解因输出文件编码不支持 Unicode 字符(如 č)导致 UnicodeEncodeError 的根本原因,并提供两种可靠修复方式:显式指定 UTF-8 编码或配置错误处理策略。
本文详解因输出文件编码不支持 unicode 字符(如 `č`)导致 `unicodeencodeerror` 的根本原因,并提供两种可靠修复方式:显式指定 utf-8 编码或配置错误处理策略。
在使用 Python 处理含国际化字符(如捷克语 pečnostní informační služba 中的 č、š、í)的 CSV 文件时,常见错误 UnicodeEncodeError: 'charmap' codec can't encode character '\u010d' 并非数据本身有问题,而是输出文件默认采用系统本地编码(如 Windows 的 cp1252),该编码无法表示 UTF-8 源数据中的扩展 Unicode 字符。
问题核心在于:open(output_file, 'w') 在 Windows 环境下默认使用 cp1252 编码,而 č(U+010D)不在其字符映射表中,导致 csv.DictWriter.writerow() 内部调用 .encode('cp1252') 时抛出异常。
✅ 推荐方案:统一使用 UTF-8 编码(兼顾兼容性与完整性)
为输入和输出文件均显式声明 encoding='utf-8',确保全程 Unicode 一致:
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)
writer.writerow(row)⚠️ 注意事项:
使用 qbo-mileage CLI 及用户凭证,从 Airtable、Outlook 或 Google Calendar 记录生成 QuickBooks Online 里程 CSV 文件。
- newline='' 是 csv 模块的强制要求,避免在 Windows 上产生额外空行;
- encoding='utf-8-sig' 用于读取带 BOM 的 UTF-8 文件(如 Excel 导出的 CSV),自动剥离 BOM;
- encoding='utf-8' 写入时无需 BOM(除非目标系统明确需要),简洁且通用。
❌ 备选方案(仅限临时调试或数据可容忍丢失):忽略/替换非法字符
若必须使用 cp1252(如对接遗留系统),可通过 errors 参数控制编码行为:
# 方式1:静默丢弃无法编码的字符
with open(output_file, 'w', encoding='cp1252', errors='ignore') as f_output:
writer = csv.DictWriter(f_output, fieldnames=fieldnames)
# ... 写入逻辑
# 方式2:将无法编码的字符替换为 '?'
with open(output_file, 'w', encoding='cp1252', errors='replace') as f_output:
# ...但此方式会破坏原始语义(如 pečnostní → pe?nostni),不建议用于生产环境。
立即学习“Python免费学习笔记(深入)”;
? 总结:
Unicode 错误本质是编码协议不匹配。坚持“读什么编码,就写什么编码”原则——当输入含 UTF-8 字符时,输出必须指定 encoding='utf-8'。这是最安全、最符合现代标准的实践,同时确保数据完整性与跨平台兼容性。

















