如何自动检测文本文件编码?

Xiè*_*léi 86 linux encoding batch

有许多纯文本文件以不同的字符集编码。

我想将它们全部转换为 UTF-8,但在运行 iconv 之前,我需要知道其原始编码。大多数浏览器都有Auto Detect编码选项,但是我无法一一检查这些文本文件,因为太多了。

只有知道原始编码,然后我才能将文本转换为iconv -f DETECTED_CHARSET -t utf-8.

是否有任何实用程序可以检测纯文本文件的编码?它不必是 100% 完美的,我不介意在 1,000,000 个文件中是否有 100 个文件被错误转换。

use*_*686 76

试试在 PyPI 上可用的chardet Python 模块:

pip install chardet
Run Code Online (Sandbox Code Playgroud)

然后运行chardetect myfile.txt

Chardet 基于Mozilla 使用的检测代码,因此它应该给出合理的结果,前提是输入文本足够长以进行统计分析。请阅读项目文档

正如评论中提到的,它很慢,但一些发行版还提供了原始 C++ 版本,正如 @Xavier 在https://superuser.com/a/609056 中发现的那样。某处也有 Java 版本。

  • 是的,它已经在 Ubuntu Universe 存储库中打包为`python-chardet`。 (4认同)
  • @谢继雷:让它通宵运行之类的。字符集检测*是*一个[复杂的过程](http://chardet.feedparser.org/docs/faq.html)。您也可以尝试基于 Java 的 jChardet 或...原始 *chardet* 是 [Mozilla 的一部分](http://www-archive.mozilla.org/projects/intl/chardet.html),但只有 C++ 源可用,没有命令行工具。 (2认同)
  • 关于速度:运行`chardet <(head -c4000 filename.txt)` 对我的用例来说要快得多,而且同样成功。(如果不清楚这个 bash 语法将只向 chardet 发送前 4000 个字节) (2认同)
  • @ndemou我有`chardet==3.0.4`,命令行工具的实际可执行文件名称是`chardetect`而不是`chardet`。 (2认同)

小智 39

我会使用这个简单的命令:

encoding=$(file -bi myfile.txt)
Run Code Online (Sandbox Code Playgroud)

或者,如果您只想要实际的字符集(如utf-8):

encoding=$(file -b --mime-encoding myfile.txt)
Run Code Online (Sandbox Code Playgroud)

  • 文件向我展示了 iso-8859-1 (8认同)
  • 不幸的是,`file` 只检测具有特定属性的编码,例如 UTF-8 或 UTF-16。其余的——旧的 ISO8859 或他们的 MS-DOS 和 Windows 通讯员——被列为“unknown-8bit”或类似的东西,即使对于`chardet` 以 99% 的置信度检测到的文件。 (7认同)
  • @james.garriss:文件扩展名与其(文本)内容编码无关。 (3认同)

小智 31

在基于 Debian 的 Linux 上,uchardet包 ( Debian / Ubuntu ) 提供了一个命令行工具。请参阅下面的包装说明:

 universal charset detection library - cli utility
 .
 uchardet is a C language binding of the original C++ implementation
 of the universal charset detection library by Mozilla.
 .
 uchardet is a encoding detector library, which takes a sequence of
 bytes in an unknown character encoding without any additional
 information, and attempts to determine the encoding of the text.
 .
 The original code of universalchardet is available at
 http://lxr.mozilla.org/seamonkey/source/extensions/universalchardet
 .
 Techniques used by universalchardet are described at
 http://www.mozilla.org/projects/intl/UniversalCharsetDetection.html
Run Code Online (Sandbox Code Playgroud)

  • 谢谢!从项目的主页上看,我并不清楚是否包含 CLI。通过 Homebrew 安装 `uchardet` 时,它也可以在 OS X 上使用。 (3认同)

小智 17

对于 Linux,有enca,对于 Solaris,您可以使用auto_ef

  • Enca 完全没有通过“实际做某事”的测试。 (12认同)
  • uchardet 失败(检测到 CP1252 而不是实际的 CP1250),但 enca 工作正常。(单个示例,难以概括......) (2认同)