2012-04-14 151 views
5

有沒有辦法在Python中識別文本文件是否是UTF-8?如何檢測文件是否使用UTF-8編碼?

如果文件是UTF-8,我真的很想知道。我不需要檢測其他編碼。

+1

重複? http://stackoverflow.com/questions/436220/python-is-there-a-way-to-determine-the-encoding-of-text-file和http://stackoverflow.com/questions/2144815/how- python – CppLearner 2012-04-14 18:21:07

+0

我想要檢測UTF-8(真/假),而不是每個編碼。 – Riki137 2012-04-14 18:27:54

+0

你可以用高信度猜測,除非你知道更多關於文件的內容,你不能確定。例如,文件的類型(在這種情況下,您要求輸入文本文件)。你大部分時間都可以猜到。我去年碰到過幾次這就是爲什麼:) – CppLearner 2012-04-14 18:30:44

回答

16

你在評論中提到你只需要檢測UTF-8。如果您知道替代方案僅包含單字節編碼,那麼通常有一種解決方案。

如果您知道它是UTF-8或單字節編碼(如latin-1),請嘗試先以UTF-8打開它,然後以其他編碼打開它。如果文件僅包含ASCII字符,則即使打算用作其他編碼,它也會以UTF-8打開。如果它包含任何非ASCII字符,則幾乎總能正確檢測到兩者之間的正確字符集。

try: 
    # or codecs.open on Python 2 
    filedata = open(filename, encoding='UTF-8').read() 
except: 
    filedata = open(filename, encoding='other-single-byte-encoding').read() 

最好的辦法是使用chardet package from PyPI,直接或通過從UnicodeDamnit BeautifulSoup:

chardet的1.0.1

通用編碼檢測器

檢測:

  • Big5,GB2312,EUC-TW,HZ-GB-2312,ISO-2022-CN(繁體和簡體中文)UTF-8(2種變體),UTF-32(4種變體)
  • 中國)
  • EUC-JP,SHIFT_JIS,ISO-2022-JP(日本)
  • EUC-KR,ISO-2022-KR(韓國)
  • KOI8-R,MacCyrillic,IBM855,IBM866,ISO-8859 -5,窗-1251(西裏爾字母)
  • ISO-8859-2,窗-1250(匈牙利)
  • ISO-8859-5,窗-1251(保加利亞)
  • 個窗口1252(英文)
  • ISO-8859-7,窗戶-1253(希臘)
  • ISO-8859-8,窗戶-1255(視覺和邏輯希伯來文)
  • TIS-620(泰國)

需要Python 2.1或更高版本

但是,某些文件將在多種編碼有效,因此chardet也不是萬能的。

+0

'chardet'太慢了! – simon 2014-04-27 19:11:10

+4

@simon:這就是爲什麼['cchardet'](https://github.com/PyYoshi/cChardet)(注意:兩個'c') – jfs 2015-08-13 19:25:44

2

可靠嗎?

一般來說號,一個字節序列是沒有意義的,除非你知道如何解釋它 - 這也適用於文本文件,還整數,浮點數等

但是,也有辦法通過查看字節順序標記(如果有的話)和文件的第一個塊(以查看哪個編碼產生最明智的字符)來猜測文件的編碼。 chardet庫在這方面非常出色,但請注意這只是一種啓發式,儘管它是一個相當強大的庫。

相關問題