本文详解 Python 中因默认编码不支持 Unicode 字符(如 č)导致的 UnicodeEncodeError,提供两种可靠解决方案:显式指定 UTF-8 编码或合理处理编码异常。
本文详解 python 中因默认编码不支持 unicode 字符(如 `č`)导致的 `unicodeencodeerror`,提供两种可靠解决方案:显式指定 utf-8 编码或合理处理编码异常。
在使用 csv.DictReader 和 csv.DictWriter 处理含非 ASCII 字符(如捷克语中的 č、š、ž)的 TSV/CSV 文件时,常见错误如下:
UnicodeEncodeError: 'charmap' codec can't encode character '\u010d' in position 69: character maps to <undefined>
该错误本质是:Windows 系统下 Python 默认使用 cp1252(即 Windows-1252)编码打开文件,而 cp1252 不包含 Unicode 字符 U+010D(即 č),导致写入失败。
✅ 正确做法是显式声明输出文件的编码为 UTF-8——这是现代文本处理的黄金标准,能完整保留所有 Unicode 字符:
import csv
input_file = "input.tsv"
output_file = "output.tsv"
with open(input_file, encoding='utf-8-sig') as f_input, \
open(output_file, 'w', encoding='utf-8', newline='') as f_output:
reader = csv.DictReader(f_input, delimiter='\t')
writer = csv.DictWriter(f_output, fieldnames=reader.fieldnames, delimiter='\t')
writer.writeheader()
for row in reader:
print(row)
writer.writerow(row)⚠️ 注意关键细节:
- encoding='utf-8-sig' 用于读取带 BOM 的 UTF-8 文件(如 Excel 导出的 TSV),自动剥离 BOM;
- encoding='utf-8' 必须显式指定于 open(..., 'w'),否则 Windows 下默认 cp1252;
- newline='' 是 csv 模块的强制要求,避免在 Windows 上产生多余空行;
- delimiter='\t' 需与 DictReader 保持一致,确保字段正确解析。
? 替代方案(仅限兼容性兜底):若必须输出 cp1252 编码(如对接老旧系统),可启用错误处理策略,但会丢失字符:
# ⚠️ 不推荐:丢弃无法编码的字符(如 č → '')
with open(output_file, 'w', encoding='cp1252', errors='ignore') as f_output:
writer = csv.DictWriter(f_output, fieldnames=reader.fieldnames)
writer.writeheader()
for row in reader:
writer.writerow(row)
# ✅ 更稳妥的替代:替换不可编码字符为问号(保留结构)
# with open(output_file, 'w', encoding='cp1252', errors='replace') as f_output:? 总结:
- 根本解法是统一使用 UTF-8 编码读写,兼顾国际字符支持与跨平台兼容性;
- 切勿依赖系统默认编码,始终显式声明 encoding 参数;
- utf-8-sig 用于读,utf-8 + newline='' 用于写,是 CSV/TSV 处理的最佳实践组合。


















