【发布时间】:2013-04-13 00:08:34
【问题描述】:
我正在使用 IMAP 协议获取电子邮件的文本/HTML BODY 部分。
为此,我所做的是使用BODYSTRUCTURE 调用来获取BODY 索引和一部分的字符集,然后使用BODY[INDEX] 调用,获取原始文本,并尝试使用Python解码函数。
现在我的问题是,即使在使用给定字符集(从 BODYSTRUCTURE 调用获得的字符集连同该部分一起)解码某些文本部分之后,它们仍然使用一些未知编码进行编码。
只有葡萄牙语/西班牙语/其他拉丁文本会出现此问题,因此我认为这是某种葡萄牙语/西班牙语编码。
现在我的问题是,如何检测到这种情况并正确解码?首先,我假设使用给定字符集解码文本应该不会留下任何编码字符,但如果确实发生了这种情况,就像现在发生的那样,我该如何找到一种通用的方法来解码这些字符?
我假设我可以尝试一个常见字符集列表并为所有这些执行try: except: 循环以尝试解码给定文本,但老实说,我更喜欢更好的解决方案。
伪代码是这样的:
# Obtain BODYSTRUCTURE call
data, result = imap_instance.uid('fetch', email_uid, '(BODYSTRUCTURE)')
part_body_index, part_charset = parse_BODY_index_and_charset_from_response(data)
text_part, result = imap_instance.uid('fetch', email_uid, '(BODY['+str(part_body_index)+'])')
if len(part_charset) > 0:
try:
text_part = text_part.decode(part_charset, 'ignore')
except:
pass
# Content of "text_part" variable after this should be text with no encoded characters...
# But that's not the case
编码文本示例:
A 05/04/2013, =E0s 11:09, XYZ escreveu:>
这个文本是用 iso-8859-1 编码的,解码它仍然是这样。字符串中的符号 =E0 是字符“À”。
In=EDcio da mensagem reenviada:
这个文本是用 windows-1252 编码的,解码后仍然是这样。字符串中的符号 =ED 是字符“í”。
【问题讨论】:
标签: python unicode encoding utf-8 imaplib