You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从mbox提取邮件后在Neovim中出现乱码问题求助

邮件转码后在Vim/Neovim中显示乱码的问题解决

问题描述

从mbox文件片段转换出可读邮件后,在Neovim中打开出现乱码:原本的das显示为da?s。已在.vimrc中配置set encoding=utf-8和set fileencodings=utf-8。

相关文件与操作信息:

  1. 原邮件文件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--
  1. 使用munpack解压命令及输出:
$ munpack -t emailfile.txt
part1 (text/plain)
part2 (text/html)
$ cat part1


ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ das ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
  1. 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中手动修复

打开异常文件后,执行以下步骤:

  1. 将光标移到ÿ字符上,按ga查看其编码(应为0xFF);
  2. 执行全局替换命令删除无效字符:
    :%s/\xFF//g
    
    或者直接替换错误字符串:
    :%s/daÿs/das/g
    

方法3:替换转码工具

可以改用更可靠的邮件转码工具,比如uudeview或formail:

  • 使用uudeview解压:
    uudeview -i emailfile.txt
    
  • 或者用formail配合quoted-printable解码工具处理原邮件。

内容的提问来源于stack exchange,提问作者ecjb

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 13:26:04