如何解析电子邮件中的德语元音变音和其他特殊字符

问题描述 投票:0回答:1

我正在尝试使用 python 的

email
模块及其由
Parser()
子模块提供的
email.utils
来解析电子邮件。

但是,有一些特殊字符我无法正确解析/转换。

这是我到目前为止得到的脚本:

import sys
import email
from email.parser import Parser

full_msg = Parser().parse(sys.stdin)
msg = full_msg  # this ugly line is part of former debugging

sender = msg['from']
to = msg['to']
subject = msg['subject']
body = msg.get_payload()
date = msg['Date']


fname = '{}.txt'.format(date)
with open(fname, 'w') as f:
    f.write('{:10}{}\n'.format('Von:', sender))
    f.write('{:10}{}\n'.format('An:', to))
    f.write('{:10}{}\n'.format('Betreff:', subject))
    f.write('{}\n'.format(body))

由于我要解析国际邮件和德国邮件,因此我必须处理所谓的“Umlaute”(

ä
ü
ö
)和一些其他字符,例如
ß
和省略号(
...
)。

例如像这样的身体

Würde Dürfte Könnte

得到的

W=C3=BCrde D=C3=BCrfte K=C3=B6nnte=

以及

的主题
Das dürfte jetzt klappen

成为

=?utf-8?Q?Das_d=C3=BCrfte_jetzt_klappen?=

有没有办法解决这些编码/解码问题?我错过了什么?


更新1:

系统的语言分别。编码设置为

en_US.UTF-8
。我通过重新配置可用的区域设置将其更改为
de_DE.UTF-8
。然而,这根本没有改变输出。
locale
给出:

LANG=de_DE.UTF-8
LANGUAGE=
LC_CTYPE="de_DE.UTF-8"
LC_NUMERIC="de_DE.UTF-8"
LC_TIME="de_DE.UTF-8"
LC_COLLATE="de_DE.UTF-8"
LC_MONETARY="de_DE.UTF-8"
LC_MESSAGES="de_DE.UTF-8"
LC_PAPER="de_DE.UTF-8"
LC_NAME="de_DE.UTF-8"
LC_ADDRESS="de_DE.UTF-8"
LC_TELEPHONE="de_DE.UTF-8"
LC_MEASUREMENT="de_DE.UTF-8"
LC_IDENTIFICATION="de_DE.UTF-8"
LC_ALL=

更新2:

我发现这种类型的字符串格式被称为Quoted-printable。有一个名为 quopri 的 Python 模块可以处理这种格式,但我无法获得满意的结果。然而,我使用 MailParser 切换到 JavaScript,这就像一个魅力。

python email parsing encoding character-encoding
1个回答
0
投票

我想我参加聚会有点晚了...

我今天遇到了与您完全相同的问题,这让我想到了您的问题。您关于 quopri 库的第二次更新非常有帮助,基于此我找到了解决方案:

quopri.decodestring(s).decode("utf-8")

其中

s
是包含带引号的可打印内容的字符串。

>>> import quopri
>>> print(quopri.decodestring('W=C3=BCrde D=C3=BCrfte K=C3=B6nnte=').decode('utf-8'))
Würde Dürfte Könnte

不幸的是,这并不能解决第二个示例中的

=?utf-8?Q?
前缀:

>>> print(quopri.decodestring('=?utf-8?Q?Das_d=C3=BCrfte_jetzt_klappen?=').decode('utf-8'))
=?utf-8?Q?Das_dürfte_jetzt_klappen?
© www.soinside.com 2019 - 2024. All rights reserved.