在Python中转换拉丁-1编码的UTF-8字符串

在Python中转换拉丁-1编码的UTF-8字符串,python,string,character-encoding,Python,String,Character Encoding,我正在使用Python2.x-libraryemail来迭代一些.eml文件,但我已经安装了Python3.x 我使用.get\u filename()提取每个有效负载(附件)标题中的文件名。头中没有设置编码,因此我认为Python 3.x将返回的字符串解释为utf-8。然而,字符串在包含特殊字符(如“ø”)时看起来是这样的: 我在很多方面都失败了,无法将这个字符串转换为utf-8是否转换为字节,以及使用latin-1、ISO-8859-1(应该是相同的)和utf-8进行反编码 我还尝试使用:

我正在使用Python2.x-library
email
来迭代一些.eml文件,但我已经安装了Python3.x

我使用
.get\u filename()
提取每个有效负载(附件)标题中的文件名。头中没有设置编码,因此我认为Python 3.x将返回的
字符串解释为
utf-8
。然而,
字符串
在包含特殊字符(如“ø”)时看起来是这样的:

我在很多方面都失败了,无法将这个字符串转换为
utf-8
是否转换为字节,以及使用
latin-1
ISO-8859-1
(应该是相同的)和
utf-8
进行反编码

我还尝试使用:

ast.literal_eval(r"b'=?ISO-8859-1?Q?Sp=F8rgeskema=2Edoc?='")
并对其进行解码,但它仍然返回包含编码字符的原始字符串


如何处理此问题?

您正在处理电子邮件,因此可以使用电子邮件处理功能:

试试看。 最后一个示例(第二个示例,非常小的模块:

>>> from email.header import decode_header
>>> decode_header('=?iso-8859-1?q?p=F6stal?=')
[(b'p\xf6stal', 'iso-8859-1')]
还有一个Python2.7版本

因此,对于您的情况:

subj = '=?ISO-8859-1?Q?Sp=F8rgeskema=2Edoc?='
subject, encoder = email.header.decode_header(subj)[0]
print(subject.decode(encoder))

您正在处理电子邮件,因此可以使用电子邮件处理功能:

试试看。 最后一个示例(第二个示例,非常小的模块:

>>> from email.header import decode_header
>>> decode_header('=?iso-8859-1?q?p=F6stal?=')
[(b'p\xf6stal', 'iso-8859-1')]
还有一个Python2.7版本

因此,对于您的情况:

subj = '=?ISO-8859-1?Q?Sp=F8rgeskema=2Edoc?='
subject, encoder = email.header.decode_header(subj)[0]
print(subject.decode(encoder))

这不是
ast
,这是带引号的RFC2047可打印。
email
也是Python3的一部分。很长一段时间以来,它一直是标准库的一部分,不过您会注意到它在Python3.6中得到了重大的改进。如果可能,您希望升级到至少3.6。MIME附件中使用的正确编码t names不是RFC2047,但许多电子邮件客户端作者不知道这一点,这是一个悲哀的事实。作为记录,符合标准的规范是RFC2231。这不是
ast
,这是RFC2047,可以打印。
email
也是Python 3的一部分。很长一段时间以来,它都是标准库的一部分,虽然您会注意到它在Python 3.6中得到了重大的改进。如果可能的话,您希望至少升级到3.6。MIME附件名称中使用的正确编码不是RFC2047,但许多电子邮件客户端作者不知道这一点,这是一个悲哀的事实。请注意,符合标准的规范是RFC2231。