【问题标题】:How do I detect if a file is encoded using UTF-8?如何检测文件是否使用 UTF-8 编码?
【发布时间】:2012-04-26 17:14:27
【问题描述】:

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

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

【问题讨论】:

  • 我要求检测 UTF-8(真/假),而不是所有编码。
  • 您可以以很高的置信率进行猜测,除非您对无法确定的文件内容了解得更多。例如,文件的类型(在这种情况下,您要求的是文本文件)。大多数时候你可以猜到。去年我遇到过几次这就是为什么:)
  • @Riki137 如果您知道替代方案是单字节编码,我添加了一些有关检测 UTF-8 的信息。

标签: python unicode utf-8 character-encoding


【解决方案1】:

您在评论中提到您只需要检测 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 package from PyPI,或者通过BeautifulSoup 中的UnicodeDamnit

chardet 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 并不是万能的。

【讨论】:

  • chardet 太慢了!
  • @simon:这就是为什么有cchardet(注:两个c
【解决方案2】:

可靠吗?没有。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-15
    • 1970-01-01
    • 2011-05-23
    • 1970-01-01
    • 2017-04-20
    • 1970-01-01
    • 2010-12-01
    相关资源
    最近更新 更多