在Python中将=替换为'\x'并解码

7 投票
3 回答
9290 浏览
提问于 2025-04-17 20:10

我用Python模块获取了一封邮件的主题,得到了一个字符串。

'=D8=B3=D9=84=D8=A7=D9=85_=DA=A9=D8=AC=D8=A7=D8=A6=DB=8C?=' 

我知道这个字符串是用'utf-8'编码的。Python有一个方法可以用来解码这样的字符串。不过,在使用这个方法之前,我需要把字符串中的=符号替换成\x。经过手动替换后,再打印解码后的结果,我得到了字符串 سلام_کجائی,这正是我想要的。我的问题是,怎么能自动完成这个替换呢?这个问题似乎比简单地使用字符串的替换函数要复杂。

下面是我在手动操作后使用的代码:

r='\xD8\xB3\xD9\x84\xD8\xA7\xD9\x85_\xDA\xA9\xD8\xAC\xD8\xA7\xD8\xA6\xDB\x8C'
print r.decode('utf-8')

如果有任何可行的想法,我会非常感激。

3 个回答

0

在Python 3中,如果你想像处理字符串一样来解码 \x 这种格式的内容,可以在前面加一个b前缀:

>>> b"\xe4\xb8\x8b\xe4\xb8\x80\xe6\xad\xa5".decode("utf-8")
'下一步'
4

这种编码方式叫做“引用可打印编码”。在Python中有一个模块可以用来进行这种编码和解码。

你说得对,这其实就是对二进制字符串的简单引用,所以你需要在之后进行UTF-8解码。(当然是指字符串是UTF-8格式的。不过看起来是对的,尽管我不太了解这个语言。)

import quopri

print quopri.decodestring( "'=D8=B3=D9=84=D8=A7=D9=85_=DA=A9=D8=AC=D8=A7=D8=A6=DB=8C?='" ).decode( "utf-8" )
8

只需要把它从quoted-printable格式解码,就能得到utf8编码的字节串:

In [35]: s = '=D8=B3=D9=84=D8=A7=D9=85_=DA=A9=D8=AC=D8=A7=D8=A6=DB=8C?='
In [36]: s.decode('quoted-printable')
Out[36]: '\xd8\xb3\xd9\x84\xd8\xa7\xd9\x85_\xda\xa9\xd8\xac\xd8\xa7\xd8\xa6\xdb\x8c?'

然后,如果需要的话,可以再把utf-8转换成unicode:

In [37]: s.decode('quoted-printable').decode('utf8')
Out[37]: u'\u0633\u0644\u0627\u0645_\u06a9\u062c\u0627\u0626\u06cc?'

 

In [39]: print s.decode('quoted-printable')
سلام_کجائی?

撰写回答