You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

运行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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 04:22:21