Quoted-printable编码的介绍和quopri库的使用

Posted 小小明-代码实体

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Quoted-printable编码的介绍和quopri库的使用相关的知识,希望对你有一定的参考价值。

之前看到群友这样一个问题:

大概就是调用网络接口得到的数据是如下形式:

text = """=E5=9B=A0=E4=B8=BA=E4=B8=81=E4=BF=8A=E6=99=96=E5=8F=AA=E8=B7=9F=E7=9D=80=
=E9=BA=A6=E8=BF=AA=E5=B0=B1=E4=B8=8D=E5=8F=AF=E8=83=BD=E9=82=A3=E5=88=B0=
=E6=80=BB=E5=86=A0=E5=86=9B=E6=88=92=E6=8C=87=EF=BC=8C=E8=80=83=E8=99=91=
=E5=88=B0=E6=8A=A4=E7=90=83=E9=97=AE=E9=A2=98=EF=BC=8C=E5=A6=82=E6=9E=9C=
=E7=94=A8=E9=BA=A6=E8=BF=AA=E6=8D=A2=E4=BA=A8=E5=88=A9=E7=9A=84=E8=AF=9D=
=E8=AF=B4=E4=B8=8D=E5=AE=9A=E5=B0=B1=E8=A1=8C=EF=BC=8C=E5=BD=93=E7=84=B6=
=E8=AF=B8=E8=91=9B=E5=AD=94=E6=98=8E=E8=BF=99=E4=B8=AA=E8=80=81=E7=8B=90=
=E7=8B=B8=E8=82=AF=E5=AE=9A=E6=98=AF=E7=95=A5=E6=87=82=E8=BF=99=E4=BB=B6=
=E4=BA=8B=E7=9A=84=EF=BC=8C=E4=BB=96=E7=AC=AC=E4=B8=80=E4=B8=AA=E4=B8=8D=
=E7=AD=94=E5=BA=94=EF=BC=8C=E5=B0=B1=E7=AE=97=E4=BB=96=E7=AD=94=E5=BA=94=
=E4=BA=86=EF=BC=8C=E7=BC=9D=E5=B0=8F=E8=82=9B=E8=83=BD=E7=AD=94=E5=BA=94=
=E5=90=97=EF=BC=9F=E6=89=80=E4=BB=A5=E8=BF=99=E6=95=B4=E4=BB=B6=E4=BA=8B=
=E6=83=85=E7=9A=84=E4=BA=AE=E7=82=B9=E5=B0=B1=E5=9C=A8=E4=BA=8E=E7=A7=A6=
=E5=A5=8B"""

其实这是Quoted-Printable Content-Transfer-Encoding编码出来的文本,这种编码的目的是为了防止文字传输时编码格式被修改,参看:https://www.freesoft.org/CIE/RFC/1521/6.htm

对于这种编码形式,python内置库提供了quopri能够解码上述文本:

import quopri

result = quopri.decodestring(text).decode("u8")
result
'因为丁俊晖只跟着麦迪就不可能那到总冠军戒指,考虑到护球问题,如果用麦迪换亨利的话说不定就行,当然诸葛孔明这个老狐狸肯定是略懂这件事的,他第一个不答应,就算他答应了,缝小肛能答应吗?所以这整件事情的亮点就在于秦奋'

关于quopri模块可参考:https://docs.python.org/zh-cn/3/library/quopri.html

也就四个方法:

下面再测试一下编码:

text = "测试 Quoted-Printable \\t编码"
quopri.encodestring(text.encode("u8"))
b'=E6=B5=8B=E8=AF=95 Quoted-Printable \\t=E7=BC=96=E7=A0=81'

其中quotetabs参数表示是否对空格和制表符编码,默认不编码。
我们测试一下对空格和制表符编码:

quopri.encodestring(text.encode("u8"), quotetabs=True)
b'=E6=B5=8B=E8=AF=95=20Quoted-Printable=20=09=E7=BC=96=E7=A0=81'

可以看到空格和制表符分别被转换成为=20=09

header参数则控制了空格是否被编码为下划线:

quopri.encodestring(text.encode("u8"), header=True)
b'=E6=B5=8B=E8=AF=95_Quoted-Printable_\\t=E7=BC=96=E7=A0=81'

⚠️注意:当quotetabs参数设置为True时,header参数则无效。

decodeencode与上述方法的区别在于是对流对象进行操作。

以上是关于Quoted-printable编码的介绍和quopri库的使用的主要内容,如果未能解决你的问题,请参考以下文章

Java:在quoted-printable中编码字符串

如何测试文本片段是不是是 Quoted-printable 编码的

编码问题:在 Python 中解码 Quoted-Printable 字符串

编码问题:解码Python中的Quoted-Printable字符串

简单的网络服务器:表单发布数据以quoted-printable编码

Quoted-Printable编码的邮件解码,vb.net代码怎么写,谢谢