2010-08-20 50 views
2

我想將電子郵件從mbox格式導入到Django應用程序中。所有數據庫表都是Unicode。我的問題:有時會給出錯誤的字符集,有時甚至沒有。處理這些編碼問題的最佳方法是什麼?使用python測試電子郵件字符集

到目前爲止,我只窩例外嘗試我收到(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") 

是否還有更好的,更可靠的方法?

謝謝!

回答

1

你可以問優秀的chardet庫猜測編碼。

「Python 2和3中的字符編碼自動檢測。與瀏覽器一樣聰明,開源。」

+0

謝謝里奇, 爲暗示。我想我會在導入時繼續測試2-3種最常見的編碼 - 如果這些編碼失敗了,我會爲各自的郵件設置一個標誌,並提供選項將這些電子郵件提供給用戶界面中的chardet。 – Gregor 2010-08-24 10:04:20

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。它知道測試應該以什麼順序完成。