11

有没有办法在 Python 中识别文本文件是否为 UTF-8?

我真的很想知道文件是否为 UTF-8。我不需要检测其他编码。

4

2 回答 2

22

您在评论中提到您只需要检测 UTF-8。如果您知道替代方案仅包含单字节编码,那么有一个通常有效的解决方案。

如果您知道它是 UTF-8 或单字节编码latin-1,请先尝试以 UTF-8 格式打开,然后再以其他编码格式打开。如果文件仅包含 ASCII 字符,则即使它原本打算作为其他编码,它最终也会以 UTF-8 打开。如果它包含任何非 ASCII 字符,这几乎总是能正确检测到两者之间的正确字符集。

try:
    # or codecs.open on Python <= 2.5
    # or io.open on Python > 2.5 and <= 2.7
    filedata = open(filename, encoding='UTF-8').read() 
except:
    filedata = open(filename, encoding='other-single-byte-encoding').read() 

最好的办法是直接使用chardet来自 PyPI 的包,或者通过UnicodeDamnitBeautifulSoup 使用包:

夏德 1.0.1

通用编码检测器

检测:

  • ASCII、UTF-8、UTF-16(2 个变体)、UTF-32(4 个变体)
  • Big5、GB2312、EUC-TW、HZ-GB-2312、ISO-2022-CN(繁简体中文)
  • EUC-JP、SHIFT_JIS、ISO-2022-JP(日语)
  • EUC-KR、ISO-2022-KR(韩文)
  • KOI8-R、MacCyrillic、IBM855、IBM866、ISO-8859-5、windows-1251(西里尔文)
  • ISO-8859-2、windows-1250(匈牙利语)
  • ISO-8859-5、windows-1251(保加利亚)
  • windows-1252(英文)
  • ISO-8859-7、windows-1253(希腊语)
  • ISO-8859-8、windows-1255(视觉和逻辑希伯来语)
  • TIS-620(泰语)

需要 Python 2.1 或更高版本

但是,某些文件将在多种编码中有效,因此chardet不是灵丹妙药。

于 2012-04-14T18:19:47.543 回答
3

可靠吗?不。

一般来说,一个字节序列没有意义,除非你知道如何解释它——这适用于文本文件,也适用于整数、浮点数等。

但是,有一些方法可以猜测文件的编码,通过查看字节顺序标记(如果有的话)和文件的第一个块(查看哪种编码产生最合理的字符)。该chardet库在这方面做得很好,但请注意它只是一种启发式方法,尽管它相当强大。

于 2012-04-14T18:20:38.120 回答