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

han*_*ick 5 python encoding decoding quoted-printable

在 Python 中,我得到了一个以Quoted-Printable 编码的字符串

mystring="=AC=E9"
Run Code Online (Sandbox Code Playgroud)

此字符串应打印为

é

所以我想解码它并用UTF-8编码,我猜。我明白有些事情是可能的

import quopri
quopri.decodestring('=A3=E9')
Run Code Online (Sandbox Code Playgroud)

但是,我完全迷失了。您将如何解码/编码此字符串以正确打印?

小智 6

import quopri
Run Code Online (Sandbox Code Playgroud)

编码:

您可以使用 quopri.encodestring() 将字符 'é' 编码为 Quoted-Printable。它接受一个 bytes 对象并返回 QP 编码的 bytes 对象。

encoded = quopri.encodestring('é'.encode('utf-8'))
print(encoded)
Run Code Online (Sandbox Code Playgroud)

打印 b'=C3=A9' (但不是问题中指定的“=AC=E9”或“=A3=E9”)

解码:

mystring = '=C3=A9'
decoded_string = quopri.decodestring(mystring)
print(decoded_string.decode('utf-8'))
Run Code Online (Sandbox Code Playgroud)

quopri.decodestring() 返回一个以 utf-8 编码的字节对象(这可能是您想要的)。如果要打印字符 'é',请使用 .decode()解码utf-8编码的字节对象并将 'utf-8' 作为参数传递。


han*_*ick 5

好的,我不知道为什么,但这个功能似乎有效:

from email.parser import Parser

def decode_email(msg_str):
    p = Parser()
    message = p.parsestr(msg_str)
    decoded_message = ''
    for part in message.walk():
        charset = part.get_content_charset()
        if part.get_content_type() == 'text/plain':
            part_str = part.get_payload(decode=1)
            decoded_message += part_str.decode(charset)
    return decoded_message
Run Code Online (Sandbox Code Playgroud)