2008-11-06 40 views
15

我正在寫一些郵件處理軟件在Python中遇到頭字段中的奇怪字節。我懷疑這只是格式錯誤的郵件;該消息本身聲稱是us-ascii,所以我不認爲有真正的編碼,但我希望得到一個近似於原始字符串的unicode字符串,而不拋出UnicodeDecodeError是否有一個Python庫函數試圖猜測某些字節的字符編碼?

所以,我正在尋找一個功能,需要str和可選的一些提示,並做它的最殘酷的回報unicode。我當然可以寫一個,但是如果存在這樣的功能,它的作者可能會想到更深入的瞭解這個最好的方法。

我也知道Python的設計更喜歡顯式隱式,並且標準庫的設計是爲了避免在解碼文本時產生隱含的魔力。我只想明確地說「繼續前進」。

回答

12

據我所知,標準庫沒有函數,儘管如上所述編寫一個函數並不困難。我認爲我正在尋找的是一種解碼字符串並保證它不會拋出異常的方法。 string.decode的errors參數可以做到這一點。

def decode(s, encodings=('ascii', 'utf8', 'latin1')): 
    for encoding in encodings: 
     try: 
      return s.decode(encoding) 
     except UnicodeDecodeError: 
      pass 
    return s.decode('ascii', 'ignore') 
20

您可能也有興趣Universal Encoding Detector

+0

+1比我快5秒:-) – 2008-11-06 15:27:45

+0

真的很有用,謝謝。但不在標準庫中。 – Nick 2008-11-07 21:03:47

18

+1爲chardet模塊(由@insin建議)。

它不是標準庫,但是你可以用下面的命令輕鬆安裝:

$ pip install chardet 

Example

>>> import chardet 
>>> import urllib 
>>> detect = lambda url: chardet.detect(urllib.urlopen(url).read()) 
>>> detect('http://stackoverflow.com') 
{'confidence': 0.85663169917190185, 'encoding': 'ISO-8859-2'}  
>>> detect('https://stackoverflow.com/questions/269060/is-there-a-python-lib') 
{'confidence': 0.98999999999999999, 'encoding': 'utf-8'} 

Installing Pip如果你沒有一個。

+1

你覺得ISO-8859-2是無稽之談嗎? – 2010-08-28 02:05:23

1

我發現的最好的方法是迭代地嘗試解碼一個預期的每個最常見的編碼,除了塊之外的其他編碼。

相關問題