原始邮件中emoji为十六进制格式的原因及Python3解码方法
问题解答
一、邮件中emoji呈现为带=十六进制格式的原因
你观察到的=F0=9F=98=97类格式是**Quoted-Printable(可打印引号编码,简称QP编码)**的标准输出,是邮件传输场景的通用规则:
- 你提供的原始邮件头中明确标注了
Content-Transfer-Encoding: quoted-printable,说明对应正文部分采用了QP编码封装 - QP编码的作用是将非ASCII字符(包括emoji、中文、特殊符号等)转换为可打印的ASCII字符,避免邮件在不同系统、不同网络节点传输时出现乱码。其核心规则是将每个非ASCII字节的十六进制值前拼接
=符号,比如emoji🙂对应的UTF-8字节为\xF0\x9F\x99\x82,经过QP编码后就会呈现为=F0=9F=99=82。
二、Python3 便捷解析方案
直接使用Python标准库内置的quopri模块即可实现原生解析,不需要手动处理=符号,对整段邮件正文的兼容性远高于手动替换方案,示例代码如下:
import quopri # 输入QP编码后的字节串 qp_encoded_str = b'=F0=9F=99=82=E2=98=BA' # 直接解码后转UTF-8字符串 decoded_content = quopri.decodestring(qp_encoded_str).decode('utf-8') print(decoded_content) # 输出 🙂☺
如果需要解析完整的邮件正文,直接把整段QP编码的内容传入quopri.decodestring即可,不需要单独提取emoji片段处理,能自动区分普通可打印字符和编码后的特殊字符,适配所有符合QP编码规则的邮件内容。
补充说明
你目前使用的手动去=再转十六进制的方案仅适合单独提取出的emoji编码片段,如果正文同时混有普通文本和QP编码字符,手动替换容易出现边界错误,使用标准库quopri是生产环境更稳妥的选择。
内容的提问来源于stack exchange,提问作者Dinesh
相关产品推荐
相关产品推荐

