不看扩展名:格式到底是怎么被识别出来的
把一份文件拖进 Everything to Markdown,它几乎立刻就知道该怎么处理。你可能会以为:它是看扩展名吧?.docx 就当 Word,.pdf 就当 PDF。但事实是——扩展名只是最后才看的线索,而且常常靠不住。
扩展名为什么不可信
扩展名是"你(或某个软件)给文件起的名字",不是文件自己的身份。以下情况太常见了:
- 把 .zip 改名成 .docx,想绕过邮件附件限制;
- 截图导出时手滑选错后缀;
- 从网上下载的 PDF,后缀其实是 .pdf(没错)但内容其实是 HTML;
- 根本没有扩展名,比如一段管道里传来的字节流。
如果只信扩展名,这些文件要么转错,要么直接失败。Everything to Markdown 的做法是:先看文件自己说什么,再看你叫它什么。
真正的依据:文件内容
每种格式在字节层面都有"自报家门"的方式。识别器会按顺序嗅探这些签名:
1. 魔数(Magic Number)
很多文件开头几个字节是固定的"身份证":
- PDF 以
%PDF-开头; - RTF 以
{\rtf开头; - 新式 Office(.docx/.xlsx/.pptx)、EPUB、ODF 都是 ZIP 包,以
PK\x03\x04开头。
看到 %PDF-,不管它叫什么名字,都知道是 PDF。
2. 包内结构(针对 ZIP 家族)
Office 三件套和 EPUB、ODF 都是 ZIP。光看出是 ZIP 还不够,得看包里有什么:
- .docx 里有
word/document.xml; - .xlsx 里有
xl/workbook.xml; - .pptx 里有
ppt/presentation.xml; - .epub 里有
META-INF/container.xml和mimetype; - .odt/.ods/.odp 在
content.xml之外还带mimetype声明自己是谁。
于是同一个 ZIP 容器,靠内部文件名就能精准区分是 Word 还是 Excel。
3. 纯文本格式的"气味"
CSV 没有魔数,也没有签名。它只能靠内容形态判断:是否每行用逗号(或分号/制表符)分隔、表头是否对齐、引号是否成对。这类"无签名"格式,扩展名才真正派上用场——如果你给了 .csv,识别器会更有把握。
一个判断顺序
综合起来,识别大致是这样一条短路链:
有魔数吗? ── 有 ──▶ 直接定格式(PDF/RTF/ZIP…)
│
└─ 没有(如 ZIP)
│
▼
解包看内部文件名? ──▶ 区分 docx/xlsx/pptx/epub/odf
│
▼
像 CSV 吗?(逗号分隔、表头对齐)
│
▼
实在不行,再用扩展名兜底
这对你意味着什么
实际用起来,你会感觉到:
- 改名不怕:把
报告.pdf改成报告.txt,照样能转; - 扩展名写错能救:后缀和实际内容不一致时,以内容为准;
- CSV 这类"裸"格式最好带上扩展名,帮识别器省一步猜测。
小结
"看内容,不看出身"让 Everything to Markdown 比"看后缀"的工具稳得多。但还有个更硬的限制我们一直没提:即使认出了格式,转换也未必能发生——尤其是 PDF。下一篇就聊这个边界。