EBView 0.4.0:一次 AI 辅助的开源词典软件考古式复活
EBView 是什么
ebview 是須藤賢一(Kenichi Suto)在 2001–2003 年间开发的 EPWING 词典阅读器,基于 EB Library(libeb)和 GTK 2,支持多词典串刺检索、全文/条件检索、外字与插图显示、X 划词取词。它曾是 Debian 官方仓库里的包(最后一个版本 0.3.6.2-3),后来因为依赖已废弃的 GTK 2:2020 年被报告 Bug #967325,2023 年随 Bug #1035776 从 unstable 移除。上游 SourceForge 项目自 0.3.6 起就停更了。
代码还在,许可证是 GPL,于是就有了这次复活:把一套二十多年前的 C 代码,重新搬回 2026 年的 GNU/Linux 和 Windows,并且在搬运过程中补上了几个原作者时代不可能有的功能。现在是 0.4.0,GitHub:https://github.com/yx-wh/ebview。
移植过程:AI 结对考古
源码约 3 万行 C,构建系统是 autotools + 两套早已失效的自定义 m4 宏(eb_LIB_EB4、AM_PATH_GTK_2_0),拿现代 GCC 一编,错误和警告连成片。整个工作以"AI 读代码、定位、写补丁,人验证、决策、发版"的结对方式进行,每一处疑难都记录在仓库的 DEBUG-NOTES.md 里。几个有代表性的坑:
- 构建系统整体换血:改用 CMake + pkg-config,
config.h自动生成;K&R 声明、缺失原型、函数指针签名逐个清理,适配 C11 和 GCC 16。 - 字体度量层重接:
pango_xft_get_font_map()+ 裸 X11Display换成pango_cairo_font_map_get_default(),去掉 Xft 依赖;默认字体从已停更的 Kochi Mincho/Gothic 迁移到 Noto CJK,旧配置自动迁移。 - 隐藏的 ABI 地雷:libeb 编译时开了
AC_SYS_LARGEFILE,off_t变 64 位会改变EB_Book结构体的二进制布局——客户端不同步这个宏,eb_initialize_book()就越界写内存,崩溃点出现在毫不相干的地方。这种问题没有 AI 辅助阅读 + 系统性排查,大概率至今是个玄学。 - 外字与编码:EPWING 的外字(gaiji)没有标准 Unicode 映射,各家词典五花八门;这次顺带解了 EBStudio 生成的
xxg2.map.ebz(zlib 分片流)外字映射表,并修了一个更隐蔽的问题(见下)。
移植到 GTK 3 的路线也探测过:约 488 处错误,自定义 GtkCellRendererEbook 的虚函数签名、GdkPixmap/GdkGC 绘图管线在 GTK 3 已被 cairo 取代,属于重写渲染层而非机械替换。权衡之后保留 GTK 2——它 API 稳定、仍被发行版提供,把精力花在功能上更划算。
0.4.0 新增了什么
1. 命令行查词
$ ebview かみあわせ
启动后立即检索,结果同时打印到标准输出。冷启动到出结果约 2 秒,峰值内存 70 MB 左右,二进制不到 1 MB——查完即退,不占后台。这是它和常驻型词典软件最本质的差别。
2. 释义区 Enter 检索:在正文里选中一段文字,按 Enter 直接以它为检索词,等同右键菜单的「检索此词」。
3. GB2312 中文正文修复。小学館《中日-日中統合辞書》(EBStudio 制作)把中文对译以 GB2312 内码直接混在 EUC-JP 文本流里。libeb 把它们解析为 EB_HOOK_GB2312 转义,但默认 hook 输出的 EUC-CN 字节与 JIS X 0208 码位重叠,整段中文变成错字。现在的方案是在 hook 层把 GB 码写成 ASCII 标记 [[gbrg:XXXX]],等整段 EUC-JP→UTF-8 转换完成后再统一解码还原——ASCII 标记可以无损穿过转码,关键词、斜体等样式全部保留。中文正文现在是可选中、可复制、可检索的真文本,而不是外字位图。
4. Windows 构建现代化:MSYS2 UCRT64 下 CMake 构建,修复了 x64 上发音播放崩溃(mciSendCommand 参数指针被截断成 DWORD——Win32 时代的推荐写法,x64 时代是 bug),exe 内嵌图标和 VERSIONINFO 版本资源,提供免安装 zip。
5. 打包与元数据:cmake --install 完整安装树;Debian 包(tools/make_deb.sh);AppStream metainfo(软件中心可显示图标与版本);三语四文帮助文档更新。
和 EBWin3/EBWin4 比,优势在哪
先说公道话:EBWin3/4 是 Windows 上非常成熟的 EPWING 方案,EBWin4 还加入了 DSL/MDX/StarDict 支持,作者是常青树,EBPocket 更是 iOS 上几乎唯一正经的 EPWING 阅读器。如果你在 Windows 上想要全格式,EBWin4 和 GoldenDict-ng 都是好选择。
EBView 的差异化,正好对两代 EBWin 各打一处:
对 EBWin3(MFC)——渲染代差。EBWin3 的正文是 GDI DrawText 一行行手绘:字形老、无复杂排版,行距字距手工凑,每个参考链接都挂下划线,视觉噪声大;遇到 JIS 字库没有的字也没有回退机制。EBView 的正文走 GtkTextView + Pango:段落级排版(自动折行、缩进、富文本 tag)、彩色链接分层、完整的 CJK 字体回退链。同一个条目两边各开一次,观感差了一个时代。
对 EBWin4(.NET Framework + 内嵌网页)——轻。EBWin4 的词条渲染本质是每条过一遍 HTML 管线,托着 .NET 运行时和内嵌浏览器两个大家伙——这有官方更新日志为证:2026 年 6 月的 4.7.14 才把释义区的 WebBrowser 控件(IE/Trident 内核,从 2013 年用到现在)换成 WebView2,安装要求里还常年挂着 .NET Framework 4.5。EBView 没有 .NET、没有 Web 引擎,就 GTK2 + libeb:二进制不到 1 MB,Windows 免安装包 13 MB,常驻内存几十 MB 量级,CLI 冷启动 2 秒出结果查完即退。同样是"打开就查",EBView 的资源曲线是针尖,EBWin4 是平台。
而 GNU/Linux 用户此前是两头堵。一头是老 EBView:上游停更二十多年,外字渲染一塌糊涂——缺 gaiji 文件时每个外字弹一个模态报错框,翻一页词典能被几十个弹窗刷屏,绘制路径里还埋着一处空指针段错误,随时整个程序闪退;一头是 Wine 跑 EBWin3:OLE 组件起不来是经典戏码,侥幸跑起来,MFC 的文字渲染再经 X 转一层,基本没法看。0.4.0 把 EBView 这头堵上了:外字渲染路径整体加固(缺文件的字体降级提示从每个外字一个模态框改成只在终端里输出的日志,段错误一并修复),外字按词典内位图直接绘制(目前是点阵显示;书内自带的 xxg2.map.ebz 外字→Unicode 映射是 zlib 分片流格式,格式已经摸清,文本化在后续计划里),GB2312 中文直接输出真文本——那条别扭的折中路线可以退役了。
其余维度汇总:
| EBView 0.4.0 | EBWin3/4 | |
|---|---|---|
| 开源性 | GPL,完整源码,任何人可审计、修改、续命 | 闭源免费软件 |
| 平台 | GNU/Linux 原生 + Windows | 仅 Windows(EBPocket 是 iOS) |
| 渲染 | GTK2 + Pango 段落排版 | EBWin3 MFC 手绘 / EBWin4 HTML |
| 运行时依赖 | GTK2 + libeb | EBWin3 MFC / EBWin4 .NET + 内嵌 Web |
| 中文正文 | 还原为 Unicode 真文本(可复制/检索) | 依赖外字位图/映射显示 |
| 配置 | 纯 XML 文本,可脚本化、可同步 | 注册表/配置文件 |
| 上手成本 | GNU/Linux apt install 一个 deb |
无 |
另有两点值得单独说:
- 可生存性。EBView 这次复活本身就是开源价值的直接证明:原作者离场二十多年,代码照样能被搬回现代系统。闭源软件没有这个选项——作者停更的那天,就是它开始过期的那天。
- 文本 vs 位图。同样是显示中文,位图方案放大就糊、不能选中复制、不能参与全文检索;Unicode 真文本方案三者都行。对做笔记、摘录的用户这是实质差别。
另外和 GoldenDict-ng 的关系不是竞争:gd-ng 是全格式瑞士军刀(EPWING/MDX/DSL/StarDict 全能,但重,QtWebEngine 渲染),EBView 是快刀——启动即查、查完即走、CLI 集成。我的用法是终端里 ebview 单語 日常速查,需要全格式重活时开 gd-ng。
下载与构建
- GitHub Release(
v0.4.0):Windows 10/11 免安装 zip、Debian/Ubuntu 的 deb(trixie/forky 实测,bookworm 依赖亦满足)、源码 tarball,附 SHA256SUMS - Debian/Ubuntu:
sudo apt install ./ebview_0.4.0_amd64.deb - 源码构建:
sudo apt install build-essential cmake pkg-config \
libgtk2.0-dev libeb16-dev zlib1g-dev gettext
tar xf ebview-0.4.0.tar.xz && cd ebview-0.4.0 && ./build.sh
词典数据自备(含 CATALOGS 文件的 EPWING 目录),程序内偏好设置 → 词典组添加即可。
结语
这次工作里最感慨的一点:須藤賢一在信息荒漠的年代(没有 Stack Overflow,没有 AI,资料是 mailing list 和 HTML 手册)单枪匹马写下这三万行,核心的 hook 渲染管线二十年后依然正确工作——我们修的大部分东西其实不是他写错了,而是世界变了。开源让代码活过了作者本人的离场,也让二十年后的接力成为可能。
致谢:原作者須藤賢一;EB Library 作者 Masatake Yamato(及 SRA);Debian 历任打包者;GoldenDict / EBWin 社区的文档与讨论。
问题与反馈请到 GitHub Issues,或在本帖回复。