从mbox提取邮件后在Neovim中出现乱码问题求助
邮件转码后在Vim/Neovim中显示乱码的问题解决
问题描述
从mbox文件片段转换出可读邮件后,在Neovim中打开出现乱码:原本的das显示为da?s。已在.vimrc中配置set encoding=utf-8和set fileencodings=utf-8。
相关文件与操作信息:
- 原邮件文件
emailfile.txt内容:
From 9999999999999999@xxx Tue Mar 09 17:00:00 +0500 2019 X-GM-THRID: 99999999999999999 X-mail-Labels: Archived,Sent,Opened MIME-Version: 1.0 Date: Tue, 09 Mar 2019 17:00:00 +0500 Message-ID: <ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ@mail.mail.com> Subject: THETITLE From: My Name <My_Name@mail.com> To: destination@mail.com Content-Type: multipart/alternative; boundary="0000000000009999999999999" --0000000000009999999999999 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ da= s ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ --0000000000009999999999999 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable <div>ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ= ZZ das ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ= > --0000000000009999999999999--
- 使用
munpack解压命令及输出:
$ munpack -t emailfile.txt part1 (text/plain) part2 (text/html) $ cat part1 ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ das ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
- Vim打开
part1的显示异常:
ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ da?s ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
补充信息:
- 系统locale输出:
$ locale LANG="" LC_COLLATE="en_US.UTF-8" LC_CTYPE="en_US.UTF-8" LC_MESSAGES="en_US.UTF-8" LC_MONETARY="en_US.UTF-8" LC_NUMERIC="en_US.UTF-8" LC_TIME="en_US.UTF-8" LC_ALL="en_US.UTF-8"
- 用
vim -Nu NONE part1打开的显示:
ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ daÿs ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ ^M
问题原因
原邮件中的da=是quoted-printable编码的软换行(用于拆分过长行,不影响实际内容),正确处理逻辑应该是将da=与下一行的s合并为das。但munpack未正确解码这个软换行,导致留下了一个无效字节(显示为ÿ或?),从而出现乱码。
解决方法
方法1:用正确的工具解码quoted-printable
使用Python的内置模块直接解码文件,确保软换行被正确处理:
import quopri # 读取原part1文件,解码后写入新文件 with open('part1', 'rb') as input_file: decoded_content = quopri.decodestring(input_file.read()) with open('part1_fixed', 'wb') as output_file: output_file.write(decoded_content)
运行脚本后,打开part1_fixed即可正常显示das。
方法2:在Vim中手动修复
打开异常文件后,执行以下步骤:
- 将光标移到
ÿ字符上,按ga查看其编码(应为0xFF); - 执行全局替换命令删除无效字符:
或者直接替换错误字符串::%s/\xFF//g:%s/daÿs/das/g
方法3:替换转码工具
可以改用更可靠的邮件转码工具,比如uudeview或formail:
- 使用
uudeview解压:uudeview -i emailfile.txt - 或者用
formail配合quoted-printable解码工具处理原邮件。
内容的提问来源于stack exchange,提问作者ecjb
相关产品推荐
相关产品推荐

