antiword为什么在ubuntu22.04上面不乱码,而在mac上出现乱码
在 Ubuntu 22.04 上,antiword 内置了对 简体中文 (GB2312/GBK/GB18030) 的解码映射表,所以能把 .doc 文件正确还原为中文。而在 macOS 上,antiword 的默认安装包里 缺少中文编码的 mapping 文件,导致读取到的原始字节流没能正确转码,显示成了乱码 ???。
⸻
为什么会这样
1. .doc 文件本身不是 Unicode,而是旧的 Word Binary 格式,文本内容一般保存为 Windows-1252、GB2312/GBK、Shift_JIS 等本地编码。
2. antiword 需要对应的 mapping 文件(/usr/share/antiword 目录下的 Mapping/*),才能把这些编码映射到 Unicode。
3. Linux 发行版(比如 Ubuntu)一般会打包好常见的中文 mapping 文件,但 macOS 上通过 brew install antiword 装的版本往往只有西文/拉丁编码,缺少中文支持。
⸻
解决办法
你有几条路可以选:
方法 1:安装/补全 antiword 的中文 mapping 文件
1. 下载 antiword 的源码:http://www.winfield.demon.nl/(或者在 GitHub 上找 mirror)。
2. 在源码包里的 Resources/Mappings 文件夹下,有 gb2312.txt / gbk.txt / big5.txt 等映射表。
3. 把需要的 mapping 文件拷贝到 macOS 的:
/usr/local/share/antiword/Mappings/
或者
/opt/homebrew/share/antiword/Mappings/
(取决于你 brew 的安装位置)。
4. 再执行:
antiword -m gb2312.txt 1.doc
就能正确显示中文。
⸻
方法 2:不用 antiword,改用 catdoc / wv / unoconv
• brew install catdoc
然后:
catdoc -w 1.doc
支持中文比 antiword 更好一些。
• 或者用 LibreOffice 的命令行工具:
libreoffice --headless --convert-to txt:Text 1.doc
⸻
方法 3:Python 读取(更推荐,跨平台可控)
import docx2txttext = docx2txt.process("1.doc") # 如果是 docx
print(text)
对于 .doc(老格式),可以用:
import textract
text = textract.process("1.doc")
print(text.decode("utf-8"))
⸻
✅ 总结:
• Ubuntu 能正常显示是因为自带了中文 mapping。
• macOS 上要么补齐 mapping 文件,要么换工具(catdoc / libreoffice / textract)。
• 如果你要做跨平台处理,建议用 Python 的 textract 或者 unoconv,这样避免依赖 antiword 的系统差异。