Gmail API - 使用 'raw' 输出并解码为 utf-8 看到奇怪的德语字符
Gmail API - Seeing strange German characters using 'raw' output and decoding into utf-8
我在使用 Gmail API 阅读电子邮件时遇到一些编码问题。
首先我使用这个检索电子邮件:
message = service.users().messages().get(userId='me', id='169481bce75af185', format='raw').execute()
之后,我使用这些行从中获取字符串并将其转换为 mime 消息:
msg_str = str(base64.urlsafe_b64decode(message['raw'].encode('utf-8')).decode('utf-8'))
mime_msg = email.message_from_string(msg_str)
然后打印我得到的:
print(mime_msg.get_payload()[0])
但是我可以在输出中看到一些奇怪的字符,例如:
Gesch=C3=A4ftsf=C3=BChrer
在消息中header我可以看到这个:
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
我做错了什么,我怎样才能得到没有奇怪字符的正确输出?
感谢您的宝贵时间
您的数据已编码为 UTF-8,然后通过进一步编码为 quoted-printable 以确保 7 位传输安全。这就是消息 header 告诉您的内容。使用 quopri
撤消 quoted-printable 然后 .decode
获得 Unicode:
>>> import quopri
>>> print(quopri.decodestring("Gesch=C3=A4ftsf=C3=BChrer").decode("utf-8"))
Geschäftsführer
正如 BoarGules 所建议的,它现在可以正确显示字符。浏览这个网站也让我找到了这个有用的功能:
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
将消息字符串转换为解码字符串正确显示字符。
我在使用 Gmail API 阅读电子邮件时遇到一些编码问题。 首先我使用这个检索电子邮件:
message = service.users().messages().get(userId='me', id='169481bce75af185', format='raw').execute()
之后,我使用这些行从中获取字符串并将其转换为 mime 消息:
msg_str = str(base64.urlsafe_b64decode(message['raw'].encode('utf-8')).decode('utf-8'))
mime_msg = email.message_from_string(msg_str)
然后打印我得到的:
print(mime_msg.get_payload()[0])
但是我可以在输出中看到一些奇怪的字符,例如:
Gesch=C3=A4ftsf=C3=BChrer
在消息中header我可以看到这个:
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
我做错了什么,我怎样才能得到没有奇怪字符的正确输出?
感谢您的宝贵时间
您的数据已编码为 UTF-8,然后通过进一步编码为 quoted-printable 以确保 7 位传输安全。这就是消息 header 告诉您的内容。使用 quopri
撤消 quoted-printable 然后 .decode
获得 Unicode:
>>> import quopri
>>> print(quopri.decodestring("Gesch=C3=A4ftsf=C3=BChrer").decode("utf-8"))
Geschäftsführer
正如 BoarGules 所建议的,它现在可以正确显示字符。浏览这个网站也让我找到了这个有用的功能:
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
将消息字符串转换为解码字符串正确显示字符。