邮件主题乱码的原因与解决方法:=?UTF-8?B?、=?ISO-2022-JP?B?、$B 怎么读
收到的日语邮件,主题可能显示成“=?UTF-8?B?5paH5a2X…?=”这样的英文和数字,正文可能变成“$BL@F|$N…(B”。这是用邮件发送日语时约定的写法直接显示了出来。本文说明主题中 =?…?= 的原理、B 方式和 Q 方式的区别、JIS 邮件中的 $B、正文乱码的原因,以及发送方可以采取的对策。
主题中的 =?UTF-8?B?…?= 是“用英文数字包起来的日语”
邮件头(主题、发件人等)最初按只能传输英文和数字的规则设计。因此日语主题要写明字符编码和转换方式,再替换成英文和数字发送。这就是 MIME 编码(RFC 2047),形式如下。
| 部分 | 示例 | 含义 |
|---|---|---|
| =? | =? | 包起来的文字从这里开始 |
| 字符编码 | UTF-8 / ISO-2022-JP | 内部日语所用的字符编码 |
| 转换方式 | B / Q | B 是 Base64,Q 是 Quoted-Printable |
| 内容 | 5piO5pel44Gu… | 把日语字节转成英文数字的结果 |
| ?= | ?= | 到这里结束 |
例如“=?UTF-8?B?5piO5pel44Gu5Lya6K2w44Gu6LOH5paZ44KS6YCB44KK44G+44GZ?=”,就是把一句日语(意为“发送明天的会议资料”)的 UTF-8 字节转成 Base64 的结果。邮件软件通常会自动把它还原成日语显示,但在手机通知、邮件日志、网页表单发来的通知邮件、程序提取的主题等场合,可能会以包起来的形式直接显示。
B 方式、Q 方式和 ISO-2022-JP 主题的读法
- B 方式(Base64):=?UTF-8?B?5paH5a2X5YyW44GR?= 解码后是日语的“乱码”一词。日语主题几乎都用这种方式
- Q 方式(Quoted-Printable):=?UTF-8?Q?=E6=96=87=E5=AD=97?= 解码后是“文字”。= 后面的 2 位表示 1 个字节,用于英文较多的主题
- ISO-2022-JP(JIS):=?ISO-2022-JP?B?GyRCTEBGfCROMnE1RCROO3FOQSRyGyhC?= 解码后是上面那句日语的前半部分。这是日本邮件软件长期使用的形式
为了避免一行过长,较长的主题会拆成几个 =?…?= 并换行。例如,把上面那句日语用 ISO-2022-JP 发送时,可能拆成“=?ISO-2022-JP?B?GyRCTEBGfCROMnE1RCROO3FOQSRyGyhC?=”和“=?ISO-2022-JP?B?GyRCQXckaiReJDkbKEI=?=”两部分。按规则,拆开的部分之间的空格和换行要去掉后再连接起来。
正文变成“$BL@F|$N…(B”,是 JIS 丢失了 ESC
ISO-2022-JP 是用 ESC 这个看不见的控制字符来切换“从这里开始是日语”“从这里开始是英文数字”的字符编码。“ESC $ B”开始日语,“ESC ( B”回到英文数字。把邮件当作文本复制,或导入其他系统时,如果只丢失了 ESC,切换信号和内容就会以英文数字的形式显示出来,比如“$BL@F|$N2q5D$N;qNA$rAw$j$^$9(B”。
这种形式只要把“$B”和“(B”之间的英文数字按 2 个字符对应 1 个日语字符来读,就能还原。上面的例子就是那句关于明天会议资料的日语。只是补上 ESC 重新读取,所以不会丢失文字。
正文变成“縺”“㔓‚”的原因
正文乱码发生在邮件头的“Content-Type: text/plain; charset=…”声明与正文实际编码不一致的时候。如果正文是 UTF-8,charset 却写成 Shift_JIS,就会满屏“縺”“繧”;如果没有声明 charset,接收方用西欧编码读取,就会出现一串“㔓æ”。
- 网页表单的自动回复或系统通知邮件,程序忘了写 charset
- 用 UTF-8 的邮件发送程序发送 Shift_JIS 写的模板
- 在邮件列表或转发途中,只有正文的编码被转换了
- 正文直接显示成 Base64 或 Quoted-Printable(=E3=81=82 的形式)。这不是乱码,只是包起来的形式没有解开
有些邮件软件可以手动切换显示编码(“查看”菜单中的文字编码项目等)。如果无法切换,把乱码的正文复制粘贴到工具中,工具会查出是哪种编码搞错并还原。如何辨认乱码类型,已整理在乱码类型速查表中。
发送方可以采取的乱码对策
- 1
字符编码统一为 UTF-8
现在的邮件软件和手机都能正常读取 UTF-8。主题、正文、附件名的编码统一为 UTF-8,并务必在邮件头写明 charset=UTF-8。
- 2
注意依赖环境的字符和表情符号
如果对方是用 ISO-2022-JP 接收的旧环境,“①”“㈱”“髙”等字符或表情符号可能变成“?”或“〓”。发给外部的固定文稿,改写成“(1)”“(株)”会比较安全。
- 3
先发给自己测试
系统发出的通知邮件,要在 Gmail、Outlook、手机邮件应用等多个环境中确认主题和正文。如果主题仍显示为 =?…?=,可能是发送方的编码写法有问题。
邮件附件中的 CSV 用 Excel 打开乱码,也是常见的问题。这不是邮件的问题,而是文件编码的问题,对策请参阅CSV 用 Excel 打开乱码怎么办。
常见问题
- 邮件主题为什么显示 =?UTF-8?B?
- 这是把日语主题用英文数字包起来发送的规则(MIME 编码)的形式直接显示了出来。邮件软件以外的通知和日志,有时不会自动还原。=? 和 ?= 之间是 Base64,解开后按 UTF-8 读取就能还原成日语。
- =?ISO-2022-JP?B? 的主题怎么解码?
- 解开 Base64 后,按 ISO-2022-JP(JIS)读取。只解开 Base64 的话,得到的是夹杂 ESC 的英文数字。长主题被拆成多个 =?…?=,要去掉其间的空格和换行,再合起来读取。
- 邮件正文变成夹杂 $B、(B 的英文数字,是怎么回事?
- 这是用 ISO-2022-JP 写的日语丢失了作为切换信号的 ESC。把“$B”和“(B”之间的英文数字按 2 个字符对应 1 个字符来读,就能还原。
- 怎样才能让对方收到的邮件不乱码?
- 主题和正文的编码统一为 UTF-8,并在邮件头写明 charset=UTF-8。如果可能发往旧环境,要避免 ①、㈱ 等依赖环境的字符和表情符号,并先发给自己测试确认。
本文介绍的工具
相关文章
乱码类型速查表:从縺、ã、‚、ƒ、$B 判断搞错了哪种编码
“縺薙s縺ォ縺。縺ッ”“日本語”“‚±‚ñ‚É‚¿‚Í”这样的日语乱码看似杂乱,其实都是按规则变成这样的。看最先出现的几个字符,基本就能知道把哪种编码错当成了哪种。本文把最常见的 7 种乱码整理成带示例的速查表,并说明各自的成因,以及哪些能恢复、哪些不能。
阅读文章 →CSV用Excel打开乱码怎么办|UTF-8(带BOM)与GBK的区分使用
从网站或系统下载的CSV,双击用Excel打开后,“姓名,地址”变成了“濮撳悕,鍦板潃”。这并不是CSV内容坏了,只是Excel认错了字符编码。本文整理了乱码的原因、把现在这个CSV正确打开的方法、以后不再乱码的保存方法(UTF-8带BOM·GBK),以及转换时会丢失的字符。
阅读文章 →%E3%81%82、\u3042、\343 的读法:URL、JSON、Git 中日语变成编码的原因
复制 URL 得到“%E6%96%87%E5%AD%97”,查看 API 返回值看到“\u6587\u5b57”,Git 的文件名显示成“\346\226\207”。这些看起来都像乱码,其实日语并没有损坏,只是把日语的字节或编号用英文数字写了出来,你看到的正是这种“编码”。本文介绍 9 种常见写法的辨认方法和读法、它们出现的场合,以及让显示变回日语的设置。
阅读文章 →