使用Python时的编码错误
我写了一段代码,用来连接到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编码的数据库是否有效。可能不行?