我想将电子邮件从mbox格式导入Django应用程序。所有数据库表都是Unicode。我的问题:有时给出错误的字符集,有时根本没有。处理这些编码问题的最佳方法是什么?
到目前为止,我只是嵌套异常来尝试我收到邮件的两个最常见的字符集(utf-8和iso-8859-1):
if (not message.is_multipart()):
message_charset = message.get_content_charset()
msg.message = message_charset + unicode(message.get_payload(decode=False), message_charset)
else:
for part in message.walk():
if part.get_content_type() == "text/plain":
message_charset = part.get_content_charset()
try:
msg.message = message_charset + unicode(part.get_payload(decode=False), message_charset)
except(UnicodeDecodeError):
try:
msg.message = message_charset + unicode(part.get_payload(decode=False), "utf-8")
except(UnicodeDecodeError):
msg.message = message_charset + unicode(part.get_payload(decode=False), "iso-8859-1")
是否有更好,更强大的方式?
谢谢!
答案 0 :(得分:1)
您可以要求优秀的chardet库猜测编码。
“Python 2和3中的字符编码自动检测。与浏览器一样智能。开源。”
答案 1 :(得分:0)
我很抱歉,但你的策略是错误的。
首先,有些编码是专门设计用于在7位ASCII雷达下飞行,因此可以在早期的电子邮件系统中使用。目前,中文HZ
编码很少使用,但日语电子邮件似乎经常使用ISO-2022-JP
。如果您先尝试这两种方法,那么这两种方法都会被错误地解释为ASCII;您当前的策略会错误地将它们解释为UTF-8。它还会将受限制的(所有字符< U + 0080)UTF-16文本解释为UTF-8。
其次,ISO-8859-1
将所有256个可能字节中的每一个映射到Unicode字符。 random_garbage.decode('iso-8859-1')
绝不会引发异常。换句话说,任何未通过UTF-8测试的内容都将被您的策略解释为“ISO-8859-1”。
该男人说:从一开始就使用chardet
。它知道测试的顺序。