☰
mdx格式打开全攻略:从查词、拆包到格式转换
2026/9/25 1:38:08 网站建设 项目流程

简介:MDX格式打开工具是一份面向语言学习者、教师及IT开发者的词典数据转换实用工具包,用于读取、解析并展示MDX电子词典文件。包内含主程序及配套辅助文件,共23个文件,压缩包约845KB,主要包含exe可执行程序、HTML页面、XML配置、CSS样式及PNG图标等,能够帮助用户完成MDX文件到HTML的转换、查看与简单编辑,并提供中英文帮助页面与使用说明。已有974人学习下载。通过该工具包,读者可以直观了解MDX词典数据的内部结构与解析流程,掌握词典资源在浏览器中的呈现方式,也可为开发自用解析器或研究词典编译原理提供参考。此外,包中附带的使用说明与授权文档有助于规范使用,避免版权风险。

1. mdx 格式打开工具:先想清楚你是查词、拆包还是转格式

从网盘里拖下来的 mdx 文件,图标是白纸,双击只弹出“选择打开方式”,改成 zip 后缀再解压,直接报错。这是很多人第一次接触 mdx 格式打开工具时的现场:不是文件坏了,而是 mdx 和 txt、PDF 根本不是一个物种。mdx 是 Mdict 词典的打包格式,文件里同时装着词条索引和压缩后的 HTML 正文,标准做法是让词典客户端去读,而不是用文本编辑器硬开。下面按三个真实需求拆开讲:只查词怎么配客户端,想改样式怎么拆包,要转格式怎么转,最后是乱码、白板、卡死这几类高频坑。适合手头有 mdx 打不开的人,也适合要提取音频、研究词库结构的人。

2. 看懂 mdx 的三层结构:头部信息、词条索引与记录块

2.1 一个 mdx 文件里装了三样东西:头部、索引、正文

mdx 打开工具之所以不能像 PDF 阅读器那样“双击即用”,是因为 mdx 内部没有一个操作系统认识的文档对象。它更接近一个单文件的数据库页,只是恰好长着.mdx后缀。解开看,结构只有三层。

第一层是头部声明,二进制明文可以读出一批 key-value 字段。常见的有Encoding(源文本编码,UTF-8 或 GBK 最常见)、GeneratedByEngineVersion(打包器版本,1.2 或 2.0)、KeyCaseSensitive(词条是否区分大小写)、CompactHtml(正文 HTML 是否压缩空白)、StripKey(词条是否做了去空格/去撇号处理)等等。这些字段不是给人看的,是给打开工具看的工作参数。

第二层是 key block,也就是词条索引。它把每个单词映射到正文区里的偏移量和长度。查词的时候,客户端在 key block 里做二分查找,找到这个单词,再跳到对应正文区把内容解出来。所以 mdx 词库就算有几十万条词,查询也基本是毫秒级,不需要把整个文件读进内存。

第三层是 record block,装的是真正的释义正文。正文大多是 HTML,也就是你在客户端里看到的带样式的内容;也有少量是纯文本。正文按块打包并压缩,这是文件体积能被压得比较小的主要原因。同目录下常见还有一个.mdd,它不是一个词典,而是配套资源包,里面装的是 CSS、图片、发音文件和 JavaScript,内部路径一般写成/style/main.css、/audio/word.mp3这种形式。

说穿了,mdx 是一个“索引 + 压缩正文 + 外部资源”的组合包。Windows 不认识这种结构,自然没有默认关联;所以才需要专门的 mdx 格式打开工具,去实现“读头部 → 查索引 → 解压正文 → 渲染 HTML”这一整套动作。想明白这一点,后面所有工具选型就都顺了。

2.2 版本与压缩:v1.2 与 v2.0 决定哪些工具能打开

围绕 mdx 格式,你必须知道两个版本线:MdxBuilder 1.2 和 MdxBuilder 2.0。很多打开工具表现不一样,源头就在这。

1.2 是早期打包器打出来的,正文记录块多用 LZO 压缩。LZO 是当年为了照顾嵌入式设备和老手机设计的,解压快、体积小,但现代客户端和解包脚本对它的支持参差不齐。2.0 是后来 MdxBuilder 的默认版本,记录块通常改用 zlib 压缩,并在块信息里带上 Adler-32 校验。zlib 是 Python、浏览器、压缩工具链里到处都在用的算法,处理起来顺手得多。

判断一个文件是 1.2 还是 2.0,不需要去网上找什么玄学工具。用 readmdict 这类 Python 库读一次头部,看GeneratedByEngineVersion字段就能拿到结果。老式打开工具遇到 2.0 的词库容易翻车,报错千奇百怪,但翻来覆去无非两类:一类只认 LZO,遇到 zlib 直接说“找不到记录”;另一类虽然能解压,但不校验 Adler-32,遇到文件尾部被截断或非法修改时,静默输出乱码词条。

版本差异还体现在词条 key 的处理上。2.0 对大小写、撇号、空格的处理比 1.2 严格,比如KeyCaseSensitive置为 0 时,查询“apple”和“Apple”会命中同一条;置为 1 时,它们是两个不同词条。如果你在解包后发现词条数对不上预期,第一反应就应该是回去看这个字段,而不是怀疑脚本写错了。

所以选工具时,第一原则是:优先认 zlib 和 Adler-32,并在出错时能打印头部信息。readmdict、pyglossary、GoldenDict 这一代工具都满足;那些只能打开老 mdx 的历史遗留小软件,建议直接放掉。

2.3 打开工具怎么选:按查词、拆包、转格式三个需求分流

用户搜“mdx 打开工具”时,真实诉求往往分三种。一种是下载了词典只想查词——这种情况根本不需要解包,装个支持 mdx 的词典客户端就行。第二种是词典排版有问题,想看原始 HTML 和 CSS 到底引了什么;或者想从 mdd 里抽出音频做复读材料,这需要拆包工具。第三种是手里的词库在某个软件里用不了,要转成 StarDict 或纯文本,这需要转换工具。

你的需求推荐工具一句话说明
手机查词欧路词典、MDict直接把 mdx/mdd 放入词库目录,保留排版与发音
桌面查词GoldenDict支持多词库分组与排序,跨平台
看原始 HTML/CSSPython readmdict 脚本逐条解压词条并落盘,能看到作者写的真实标签
批量提取图片/音频mdict-utils一条命令解包 mdd,按内部路径还原文件
转 StarDict/其他格式pyglossary格式转换通用方案,兼容 mdx 读取与写出

判断路径很简单:只想查词直接看下一章,把客户端配好就行;要做二次开发、要修样式、要导音频的,跳过客户端去看第 4 章的解包脚本;卡在“某个软件死活读不了 mdx”的,第 6 章的转换命令能帮你兜底。工具不是越多越好,关键是知道自己这一步在拆哪个层。

3. 用词典客户端打开 mdx:MDict、欧路、GoldenDict 的加载步骤

3.1 最快路径:把 mdx 和 mdd 放对位置,MDict 立刻识别

如果你只是想在电脑或手机上查词,MDict 仍然是识别 mdx 格式最省心的客户端之一。它的加载逻辑很简单:mdx 和配套的 mdd 必须在同一个目录,且文件名一致,比如oald9.mdx配oald9.mdd。软件扫描词库目录时会自动配对,把 mdd 当作这个词典的资源包加载。

电脑版 MDict 默认会扫描安装目录下的doc文件夹。把两个文件拷进去,重新打开程序,菜单栏“词库”里就会出现这本词典。如果没出现,十有八九是目录指错了——你电脑里装了多个版本,程序读的是另一个安装目录下的库路径。打开“选项”里的“词库目录”,把路径指到你实际放文件的文件夹,再重新扫描一次就好。

手机版逻辑一样。iOS 通过文件 App 或 iTunes 的文件共享,把 mdx/mdd 拷进 MDict 的 Documents 目录;Android 大多是放进“MDict/doc”或你指定的词库文件夹,然后在 App 里点重新扫描。一个经常被忽略的小细节:有些 mdx 只有一个,没有 mdd,这不是文件缺了,而是这本词典本来就不带音频和 CSS,纯文本也能正常显示。

还有一个使用习惯的问题:MDict 有“单词典模式”和“多词典模式”。多词典模式下,同时查多个词库,结果按你设定的词典顺序排列。如果你只想看某一本,切到单词典模式,查词结果会更清爽。这不算坑,但很多人刚上手会误以为词条变少了。

3.2 欧路词典:从词库管理添加 mdx,三个设置项别漏

欧路词典是目前处理 mdx 最友好的手机客户端之一,支持 Wi-Fi 导入词库,不用连线。操作路径是打开 App,进“词库管理”,点右上角添加词库,选择“Wi-Fi 导入”,然后在电脑浏览器里访问 App 给出的地址,把 mdx 和 mdd 一起拖进去。也可以直接用文件 App 把文件拷到欧路词典/Documents下,再回 App 里扫描。

第一次加载后,有三处设置值得检查。

一是词库排序。欧路默认把内置词库放在最前面,你新导入的 mdx 可能排在列表后面。在“词库管理”里长按词典,拖到顶部,查词时默认展示的就变成它。很多人抱怨“查词怎么还是欧路自带的释义”,其实就是没调顺序。

二是“自动展开”和“多词典”开关。某些在 PC 上显示完整的词条,手机上一开始只显示一行,点开才展开完整释义。这不是打开工具坏了,而是词库的 CSS 里写了折叠逻辑,和客户端无关。想验证就把同一个词条在 MDict 或 GoldenDict 里打开对比一下。

三是 mdd 是否真的配对成功。如果词条文字能显示,但发音按钮是灰色、图片全是裂图,几乎可以断定 mdd 没有被加载。欧路对 mdd 的依赖比 MDict 更敏感,导入时最好两个文件一起传,不要只传了 mdx。还有个别词库的 mdd 文件名和 mdx 不完全一致,这种要手动改名配对,属于打包者的习惯问题,不属于工具故障。

3.3 GoldenDict:桌面端加载 mdx 的分组与样式排错

GoldenDict 是我在桌面端的主力 mdx 打开工具,原因只有一个:它能同时加载几十本词典,还能给词典分组,排版基本还原,比很多网页版词典还好用。加载入口在菜单栏“编辑 → 词典 → 词典来源 → 添加”,选中 mdx 或 mdd 文件即可。GoldenDict 会自动读取同目录同名的 mdd,通常不需要额外配置。

加载后建议立刻做个分组。GoldenDict 的“词典组”功能允许把不同用途的词库分开,比如“牛津系列”“朗文系列”“专业术语”各一组。查词时只在当前组里搜。分组操作在同一个词典来源面板里完成:先新建组,再把词典拖进去。组的优先级有讲究——同一组里,排在上面的词典释义会排在结果前面。

样式排错是桌面端使用里最常踩坑的地方。GoldenDict 渲染 mdx 时,如果词条里引用了/style/main.css,它得从 mdd 里把这个 CSS 解出来再套到页面上。你要是能看到字但看不到排版,先右键点击词条页面,选“查看页面源代码”,看 CSS 引用路径长什么样,再去 mdd 里对一遍。常见病根是大小写不一致:词条里写/Style/Main.CSS,mdd 里实际路径是/style/main.css,Windows 上不敏感没问题,迁移到 Linux 或容器里就翻车。这时候要么改引用,要么用解包工具把文件导出并修正路径,后文会讲具体命令。

GoldenDict 对新版 mdx 的兼容整体不错,但如果你用的是很老的版本,遇到 zlib 词库加载后一片空白,先升级,别急着换词库。这条经验帮我省过不少时间。

4. 用 Python 拆开 mdx:readmdict 最小脚本与 mdd 资源导出

4.1 安装 readmdict 并读取词条的最小脚本

需要看原始 HTML、要修 CSS、要批量提取内容的场景,就该上解包脚本了。常见做法是用 Python 的 readmdict 库,它把 mdx 的头部、词条索引、记录块解压逻辑封装好,几分钟就能读出词条内容。先安装:

pip install readmdict

然后是最小读取脚本:

from readmdict import MDX mdx_path = "oald9.mdx" mdx = MDX(mdx_path) # header 里能看到编码、打包器版本、词条数量等声明信息 print(mdx.header) for idx, (word, definition) in enumerate(mdx.items()): if idx >= 3: break print(word.decode("utf-8", "ignore")) print(definition.decode("utf-8", "ignore")[:300])

这段脚本做了三件事:构造 MDX 对象时解析头部与词条索引;items()返回可迭代的词条对,每个元素是(词条, 释义正文),二者都是字节串;打印前用decode转成字符串。我特意只取了前三条做冒烟测试,避免整本几十万条全量读出的时间开销。items()是生成器式迭代,不是一次性加载全部到内存,所以应对 1GB 级词库也不会直接撑爆内存。

如果打印出来成片乱码,不要急着改脚本。先修改构造参数强制编码:

mdx = MDX(mdx_path, encoding="gb18030")

readmdict 支持在解析时指定源编码,gb18030是 GBK 超集,兼容绝大多数中文字典。注意word和definition是字节串,不是字符串,后续做正则、写文件之前都要先decode,漏掉这一步会得到一串b'...'形式的输出,是新手最容易误判的“乱码”。

4.2 把词条 HTML 落盘到浏览器:先补壳再看样式

解包后直接在终端里看 HTML 很难受,因为看不到渲染效果。我一般会把词条存成独立 HTML 文件,再打开浏览器检查。下面的脚本针对单条词条做落盘:

from readmdict import MDX import os, re mdx = MDX("oald9.mdx") out_dir = "unpacked_html" os.makedirs(out_dir, exist_ok=True) for word, definition in mdx.items(): word_str = word.decode("utf-8", "ignore") safe_name = re.sub(r'[\\/:*?"<>|]', "_", word_str) html = definition.decode("utf-8", "ignore") if "<html" not in html.lower(): html = ( "<html><head><meta charset='utf-8'></head><body>" + html + "</body></html>" ) with open(os.path.join(out_dir, safe_name + ".html"), "w", encoding="utf-8") as f: f.write(html) print("已写出", safe_name + ".html") break

两个细节值得说明。文件名里的safe_name是把词条中不能出现在文件路径里的字符替换成下划线,不然遇到can't、C/C++这类词条,Windows 会直接报错。<html>判断是为了给缺壳的释义补一个最小 HTML 文档并声明 UTF-8,否则浏览器会用系统默认编码去猜,中文容易猜成乱码。脚本里break只写第一条;真要全量落盘,把break删掉即可,但要做好生成几十万个文件的准备。

这个落盘动作最大的价值是排错:在客户端里看到白板,原因看不清;把 HTML 拖到浏览器里,CSS 缺没缺、引用的图片路径对不对、是不是 js 拼接的内容,一眼就分明。有些 mdx 的正文实际是纯文本带换行,没有任何 HTML 标签,也不算异常,只是打包源就没做富文本。

4.3 从 mdd 里导出图片、CSS 和发音文件

mdd 的拆包逻辑和 mdx 几乎一样,只是它的“词条”是内部文件路径,内容是二进制资源。很多词典的音频、图片都藏在 mdd 里,导出脚本如下:

from readmdict import MDD import os, re mdd = MDD("oald9.mdd") output_root = "mdd_resources" for fname, content in mdd.items(): name = fname.decode("utf-8", "ignore") # 内部路径可能是 /audio/a.mp3 或 \style\main.css,统一成相对路径 norm = re.sub(r"^/+|^\\\\+", "", name) norm = norm.replace("\\", "/") target = os.path.join(output_root, norm) os.makedirs(os.path.dirname(target), exist_ok=True) with open(target, "wb") as fp: fp.write(content) print("导出", target)

要点是路径还原。mdd 内部路径有时带前导/,有时用反斜杠\分隔目录,如果不处理,导出的文件会堆在一个异常层级里。上面的正则先把开头的/和\清掉,再把反斜杠统一改成斜杠,最后用os.makedirs逐级建目录。

导出一整本 mdd 可能占几百 MB 磁盘,如果你只想要发音文件,可以在循环里加一个文件名过滤:

if not norm.endswith((".mp3", ".spx", ".wav")): continue

mdd 里的音频常见格式有 mp3、spx、wav,过滤后能省下大量图片和 CSS 的写入时间。如果你不想写脚本,装 mdict-utils 后用一条命令整体解包也行:

pip install mdict-utils mdict -x oald9.mdx -d ./unpacked

-x表示解包,-d指定输出目录,mdx 和 mdd 都能这样解。它和 readmdict 的差别在于:readmdict 适合在脚本里二次处理,mdict-utils 适合快速看全貌。两个我会同时装,一个做批处理,一个做现场勘察。

5. mdx 打开工具的避坑清单:乱码、白板、缺音频、大文件卡死

5.1 释义全是&#x...;或“锟斤拷”:先查头部 Encoding 再谈编码

现象:词条标题正常,释义部分出现一堆&#x274C;或连续的“锟斤拷”,完全没有可读的汉字。

原因:这是典型的编码错位。mdx 源文本可能是 GBK 或 GB18030,打开工具却按 UTF-8 解码;也可能是解包脚本没指定encoding,readmdict 默认按 UTF-8 尝试。至于“锟斤拷”,它是 GBK 字节流被当作 UTF-8 解码后的经典产物,看到它基本可以确定是编码声明出了问题。

解决:不要靠猜,先把 mdx 头部明文读出来看Encoding字段。用 readmdict 打印mdx.header,或者用任意十六进制编辑器打开文件,在头部区域能找到可读的Encoding=GBK之类的字段。然后在构造时强制指定编码:

from readmdict import MDX mdx = MDX("dict.mdx", encoding="gb18030")

如果文件已经混装了几种编码(偶尔有打包者偷懒),更稳妥的办法是用 pyglossary 转一次格式,转换时统一指定 UTF-8,把历史遗留问题一次清掉。转换命令在第 6 章。

5.2 词条能查但样式全丢、图片裂开:mdx 和 mdd 是双胞胎

现象:词条文字能正常显示,但没有任何排版,图片显示为裂图,发音按钮灰色。换个客户端看还是一样。

原因:这个 mdx 依赖的 CSS、图片、音频全部在 mdd 里。mdx 只是装了一堆 HTML 字符串,HTML 里写了/style/main.css、/image/xxx.jpg这些引用,客户端解出 HTML 后去 mdd 里找资源,找不到就回退成纯文本。文件没配对是最常见原因。

解决:先把 mdx 和 mdd 放在同一个目录并保持同名,重新扫描。多数客户端这一步就能修好。如果还不行,用第 4.3 节的脚本解包 mdd,看里面是否存在 HTML 引用的那个路径;路径不存在或大小写对不上,就说明打包时资源引用就有问题,这不是客户端能补救的,只能修 CSS 引用或换一个版本的词库。GoldenDict 用户还要检查一点:mdd 是否也添加进了词典来源列表,有些版本只加 mdx 不会自动拉 mdd。

5.3 GoldenDict 只显示部分词条:清缓存并核对 key 匹配

现象:词典加载成功,跳转查词正常,但“词条列表”或前缀搜索只返回很少一部分,和词库实际规模不符。

原因:GoldenDict 首次加载 mdx 时会建立索引缓存。如果你中途替换过 mdx 文件,旧缓存没有失效,就会出现索引对不上、词条列表缺一截的情况。也有少数 2.0 词库的StripKey标志做了词条折叠(比如把aren't和arent合并),会让列表看起来“少”了词条,这属于打包定义,不算故障。

解决:先清缓存重新扫描。在 GoldenDict 的“词典”面板里移除该词典,退出程序,删除用户配置目录下对应的 index 缓存文件,再重新添加。清完还少,再用 readmdict 数一下真实词条数:

from readmdict import MDX mdx = MDX("dict.mdx") print(sum(1 for _ in mdx.items()))

拿这个数字和 GoldenDict 的状态栏显示的词条数对比,能判断是缓存问题还是词库本身如此。这条对比逻辑同样适用于其他客户端。

5.4 几百 MB 大词库一开就卡:子集化与 64 位客户端

现象:加载一本 1GB 左右的 mdx 后,客户端几十秒无响应,或者启动直接闪退,尤其发生在老电脑和 32 位软件组合下。

原因:mdd 里的资源文件被客户端做全量扫描,或者索引构建时一次性解压了大量 record block。32 位进程内存上限卡在那里,1GB 词库加数百 MB mdd 一进来就爆。不是词库损坏,是打开工具的资源策略不适合巨型文件。

解决:优先换 64 位 GoldenDict 或 64 位 MDict,这一步通常能解决大半问题。仍卡的话,做子集化——把大词库裁剪成常用词条版本。常见做法是用 mdict-utils 先把 mdx 解包,按词表过滤出需要的词条,再用打包命令重新生成一个小 mdx。桌面端查词体验会明显变好,代价是失去了完整词库的覆盖率。未经授权的商业词库子集化还要注意版权边界,自用或做技术验证没问题,别拿去分发。

5.5 加密或混淆的 mdx:客户端能读,拆包却乱码怎么办

现象:在词典客户端里查词一切正常,但用 readmdict 解包后,释义是一段看不出规律的乱码;或者 pyglossary 转换时报不认识的数据块。

原因:这类 mdx 在打包时对词条正文做了加密或混淆处理,客户端内置了对应密钥所以能解,第三方脚本拿不到完整算法就拆不动。它不算格式损坏,而是打包者刻意设的一道锁。和网页里“检测到开发者工具已打开,请关闭后刷新页面继续访问”的设计思路类似,都是对内容访问方式做了限制,只是 mdx 这边做在了文件层面。

解决:认清现实——这种文件的价值在“能查”,不在“能拆”。如果你只是使用,客户端正常读取就够了,不必追脚本。如果你确实需要原始文本,正路是联系词典作者索取源文件或说明文档,而不是找绕过手段。拆包工具解决的是技术兼容问题,不是版权授权问题,这条边界守住,用起来才放心。

6. 进阶:把 mdx 转成 StarDict 再重新打包,一条命令加两份验证

如果某个软件不认 mdx,最通用的兜底方案是转成 StarDict 格式。常见做法是装 pyglossary:

pip install pyglossary python -m pyglossary oald9.mdx oald9.ifo --read-format=MDict --write-format=Stardict

--read-format和--write-format可以省略,pyglossary 会根据后缀猜测,但明确写出能避免被个别同名后缀误导。转换后会生成三个文件:.ifo(描述信息)、.idx(索引)、.dict(正文),这就是 StarDict 的完整三件套。

转换完别急着分发,先验证:

cat oald9.ifo # 看 bookname 与 wordcount ls -lh oald9.ifo oald9.idx oald9.dict

看wordcount和原 mdx 的词条数是否一致。不一致,回去检查是不是有词条因编码问题被跳过。另一种更可靠的验证是再用 readmdict 读回转换产物,抽查几条多义词和包含特殊字符的词条,确认释义完整。这份验证习惯是从翻车里换来的:我第一次转 2.0 词库时没看wordcount,结果转出 8000 条空词条,全程没有报错。

转格式后还想再转回 mdx,可以用 mdict-utils 重新打包,适合你把一个词的 HTML 改好后重建子集词典:

mdict -a ./build_dir/ new.mdx --encoding=utf-8

其中build_dir里按首个字符分目录放好词条.txt或词条.html文件。具体字段建议以mdict --help为准,因为不同版本的参数略有差异。重建完的 mdx 用同一套 readmdict 脚本读一遍,验证词条数和内容。整套流程走完后,我的习惯是先确认 mdx 和 mdd 同名同目录,再谈打开;这个习惯帮我避开了至少一半的“排版不生效”问题。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询