运行interlinearize.py处理EPUB时遇UnicodeDecodeError求助
解决interlinearize处理《Candide - Voltaire.epub》时的UnicodeDecodeError
问题本质
你碰到的'charmap'编解码器无法解码字节0x9d错误,是因为代码默认用系统本地编码(比如Windows的GBK)读取epub内部的UTF-8编码文件,导致无法识别特殊字符。你之前加的encode='utf-8'方向错了——要在读取文件时指定解码编码,不是输出编码。
具体解决办法
1. 强制指定文件读取编码
找到interlinearize项目里读取epub内部文本(比如.xhtml/.html文件)的代码,把open()调用改成明确指定UTF-8编码:
# 原读取代码(类似这样) with open(target_file, 'r') as f: content = f.read() # 修改后的代码 with open(target_file, 'r', encoding='utf-8', errors='replace') as f: content = f.read()
要是还报错,换成encoding='utf-8-sig'试试——部分文件开头带BOM标记,这个编码能自动处理。
2. 自动检测文件编码(更稳妥)
如果不确定epub内部文件的编码,用chardet库自动检测后读取:
- 先安装依赖:
pip install chardet - 修改读取逻辑:
import chardet # 先以二进制模式读取文件内容 with open(target_file, 'rb') as f: raw_bytes = f.read() # 检测编码 detected_codec = chardet.detect(raw_bytes)['encoding'] # 兜底用UTF-8防止检测失败 final_codec = detected_codec or 'utf-8' # 解码内容,无法识别的字符替换成占位符 content = raw_bytes.decode(final_codec, errors='replace')
3. 预处理epub文件(无需改代码)
不想碰代码的话,手动转存epub内部文件的编码:
- 把
.epub后缀改成.zip,解压到文件夹 - 找到报错位置对应的
.xhtml/.html文件,用VS Code打开,右下角点击当前编码(比如GBK),选择"UTF-8"后保存 - 把文件夹内容重新压缩成
.zip,再改回.epub后缀,重新用interlinearize处理
额外提示
epub里的HTML文件通常会在<meta charset="utf-8">标签里声明编码,如果代码是靠解析这个标签获取编码,检查下是否有解析逻辑错误导致没拿到正确编码。
内容的提问来源于stack exchange,提问作者TouChla
相关产品推荐
相关产品推荐

