使用Python时的编码错误

1 投票
3 回答
1282 浏览
提问于 2025-04-17 15:31

我写了一段代码,用来连接到imap,然后解析邮件内容并把信息插入到数据库里。但是我在处理带重音符的字母时遇到了一些问题。

从邮件的头部信息中,我得到了以下内容:

Content-Type: text/html; charset=ISO-8859-1

不过,我不太确定这个信息是否可靠……

这封邮件是用葡萄牙语写的,所以里面有很多带重音的单词。比如,我从邮件的源代码中提取了以下短语(用我的浏览器):

"...instalação de eletrônicos..."

然后,我连接到imap并获取了一些邮件:

... typ, data = M.fetch(num, '(RFC822)') ...

当我打印内容时,得到的单词是:

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

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

instalação de eletrônicos

我该怎么做才能让它变得可读呢?我的数据库是用utf-8编码的。

3 个回答

0

这个提示说它使用的是“ISO-8859-1”字符集。所以你需要用这种编码来解码这个字符串。

试试这个:

data[0][1].decode('iso-8859-1')
0

感谢Martijn Pieters的帮助。我们发现这个邮件用了两种不同的编码。我需要把这些部分分开,然后分别处理。

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编码的数据库是否有效。可能不行?

撰写回答