【问题标题】:Encoding detection in Python, use the chardet library or not?Python中的编码检测,是否使用chardet库?
【发布时间】:2012-11-27 19:51:27
【问题描述】:

我正在编写一个应用程序,该应用程序将大量文本作为输入,可以采用任何字符编码,并且我想将其全部保存为 UTF-8。我不会收到或无法信任随数据定义的字符编码(如果有的话)。

我有一段时间使用 Python 库 chardet 来检测原始字符编码 http://pypi.python.org/pypi/chardet,但最近遇到了一些问题,我注意到它不支持斯堪的纳维亚编码(例如 iso-8859-1)。 除此之外,获得结果需要大量的时间/CPU/内存。 2MB 文本文件约 40 秒。

我尝试只使用标准的 Linux 文件

file -bi name.txt

到目前为止,我的所有文件都为我提供了 100% 的结果。对于 2MB 的文件,这大约需要 0.1 秒。它还支持斯堪的纳维亚字符编码。

所以,我想使用文件的优势是显而易见的。有什么缺点?我错过了什么吗?

【问题讨论】:

  • 如果它是 100% 准确的,那么我想知道为什么有人没有使用 file 使用的相同规则来实现它(或 chardet)...... - 你试过 @ 987654326@ 与 chardet 在大量测试数据中的比较?
  • FWIW,ISO-8859-1(及其修订版,-15)不仅是斯堪的纳维亚语,它还用于许多其他基于拉丁语的脚本。如果输入是“大部分是 ASCII”而不是 UTF-8,那么 ISO-8859-1 是一个很好的猜测。 en.wikipedia.org/wiki/ISO/IEC_8859#The_Parts_of_ISO.2FIEC_8859
  • 乔恩,我完全同意。因此我的问题。我无法获得足够的数据来使这种方法具有统计学意义,因此很遗憾,您的问题的答案是否定的。
  • Thomas,是的,对不起,你完全正确。我遇到的问题涉及斯堪的纳维亚语言,我想这就是我写它作为示例的原因。是的,同意这可能是一个很好的猜测,但如果有更准确的快速方法 - 我更愿意使用它。

标签: python encoding chardet


【解决方案1】:

由于不完全标准的编码,旧的 MS-DOS 和 Windows 格式的文件可以被检测为 unknown-8bit 而不是 ISO-8859-X。相反,Chardet 将执行有根据的猜测,报告置信度值。

http://www.faqs.org/faqs/internationalization/iso-8859-1-charset/

如果您不会处理旧的、异国情调的、不合标准的文本文件,我认为您可以使用file -i 而不会有很多问题。

【讨论】:

  • 感谢您的回答,有道理。你有这样一个文件的例子吗?我的意思是旧的 MS-DOS 或 Windows 格式。
  • 这可能是我认为的一个例子。这是一个来自 MS-DOS 应用程序的旧文本文件,1988 年。我的 Ubuntu 12.04 上的 File -i 将其检测为 application/octet-stream;字符集=二进制。某处有错误的字符。我不是 MASTER ENCONDER,但如果你用 okteta 打开它,你可以到处看到二进制数据(09 字节)。如果有其他解释,请告诉我,谢谢。 filebin.ca/OOQ4WVHhaKT
【解决方案2】:

我发现“chared”(http://code.google.com/p/chared/)非常准确。您甚至可以针对不受支持的语言训练新的编码检测器。

当 chardet 开始发挥作用时,这可能是一个不错的选择。

【讨论】:

  • 酷,谢谢。不过,它似乎有一个额外的要求,你必须知道文本中使用的语言。通常我在我的应用程序中不知道这一点。但它似乎绝对是一个不错的选择。
  • 是的,您需要了解该语言,但您可以使用例如 langid (github.com/saffsd/langid.py) 来猜测它。
猜你喜欢
  • 1970-01-01
  • 2011-03-20
  • 2011-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-26
相关资源
最近更新 更多