1

我编写了一个代码来连接 imap,然后解析正文信息并插入数据库。但是我在口音方面遇到了一些问题。

从电子邮件标题中,我得到了以下信息:

内容类型:文本/html;字符集=ISO-8859-1

但是,我不确定我是否可以相信这些信息......

电子邮件是用葡萄牙语写的,所以我们有很多带有口音的单词。例如,我从电子邮件源代码中提取以下短语(使用我的浏览器):

“...安装电子产品...”

所以,我连接到 imap 并获取了一些电子邮件:

... 典型值,数据 = M.fetch(num, '(RFC822)') ...

当我打印内容时,我得到以下单词:

print data[0][1]
instala+º+úo de eletr+¦nicos

我尝试使用.decode('utf-8')但没有成功。

instalação de eletrônicos

我怎样才能使它成为人类可读的?我的数据库是 utf-8。

4

3 回答 3

0

指定源代码编码对我有用。这是下面我的示例代码顶部的代码。这应该在 python 文件的顶部定义。

#!/usr/bin/python
# -*- coding: iso-8859-15 -*-

value = """...instalação de eletrônicos...""".decode("iso-8859-15")
print value
# prints: ...instalação de eletrônicos...

import unicodedata
value = unicodedata.normalize('NFKD', value).encode('ascii','ignore')
print value
# prints: ...instalacao de eletronicos...

现在您也可以毫无例外地执行 str(value) 。

请参阅:http ://docs.python.org/2/library/unicodedata.html

这似乎保留了所有的口音:

#!/usr/bin/python
# -*- coding: iso-8859-15 -*-
import unicodedata
value = """...instalação de eletrônicos...""".decode("iso-8859-15")
value = unicodedata.normalize('NFKC', value).encode('utf-8')
print value
print str(value)

# prints (without exceptions/errors):
# ...instalação de eletrônicos...
# ...instalação de eletrônicos...

编辑:

请注意,对于最后一个版本,即使结果看起来相同,它也不返回等于 True。例如:

#!/usr/bin/python
# -*- coding: iso-8859-15 -*-
import unicodedata
inValue = """...instalação de eletrônicos...""".decode("iso-8859-15")
normalizedValue = unicodedata.normalize('NFKC', inValue).encode('utf-8')

try:
    print inValue == normalizedValue
except UnicodeWarning:
    pass
# False

编辑2:

这将返回相同的结果:

normalizedValue = unicode("""...instalação de eletrônicos...""".decode("iso-8859-15")).encode('utf-8')
print normalizedValue 
print str(normalizedValue )

# prints (without exceptions/errors):
# ...instalação de eletrônicos...
# ...instalação de eletrônicos...

虽然我不确定这对于 utf-8 编码的数据库是否真的有效。可能不是?

于 2013-02-11T20:13:45.680 回答
0

感谢Martijn Pieters。我们发现电子邮件有两种不同的编码。我不得不分开这部分并单独对待。

于 2013-02-12T02:14:03.933 回答
0

标头说它正在使用“ISO-8859-1”字符集。因此,您需要使用该编码解码字符串。

尝试这个:

data[0][1].decode('iso-8859-1')
于 2013-02-11T18:23:43.997 回答