使用python测试电子邮件字符集

时间:2010-08-20 16:01:43

标签: python email unicode

我想将电子邮件从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")

是否有更好,更强大的方式?

谢谢!

2 个答案:

答案 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。它知道测试的顺序。