【问题标题】:In Ruby, how to reliably detect a file's encoding (including UTF-16 without BOM)?在 Ruby 中,如何可靠地检测文件的编码(包括没有 BOM 的 UTF-16)?
【发布时间】:2019-07-14 11:52:08
【问题描述】:

我需要在 Ruby 中检测文件类型和编码。

我目前正在通过magic gem 使用 libmagic,但它有一个问题:如果 UTF-16 文件没有 BOM,它不会检测到它们。 This 是此类文件的一个示例。

$ file -i text_without_bom.txt
text_without_bom.txt: application/octet-stream; charset=binary

我可以使用任何其他库或方法来正确检测 UTF-16 文件吗?

P。 S. 也尝试过rchardetcharlock_holmes,但运气不佳。

【问题讨论】:

  • file 确实擅长它的工作,但它仍然有局限性。
  • 试试puts Encoding.list看看你遇到了什么。

标签: ruby character-encoding utf-16 utf-16le


【解决方案1】:

不可能可靠地检测文本文件的编码。必须在带外告诉您编码是什么。

原因很简单:有大量的 8 位编码。在这些编码中,每个 8 位组合都是一个有效字符。由于 8 位的每个组合在每个 8 位编码中都是一个有效字符,所以 任何任意 文本文件,实际上任何任意文件 根本 中都是一个有效的文本文件em>任何 8位编码。

例如,在 ISO 8859-15 中,0xA4 是欧元符号 。在 ISO 8859-1、CP1252 和 Unicode 中,0xA4 是国际货币符号 ¤。因此,如果您有一个包含0xA4 的文件,您无法知道它是ISO 8859-15、ISO 8859-1、CP1252、UTF-16 中的半个字符、UTF-32 中的四分之一字符,UTF-8 中多字节序列的中间,或许多其他可能性之一。

【讨论】:

    【解决方案2】:

    您可以随时切断 BOM 并在没有它的情况下处理文件。 This 描述了如何做到这一点。

    【讨论】:

    • 问题是,我已经没有BOM,没有它,字符检测库无法理解它是UTF-16。
    • 没有 BOM 的总是 UTF-16 吗?
    • 不,它可能是没有 BOM 的 UTF-16。
    • 总是 UTF-16 吗?
    • 不,真的有可能。
    猜你喜欢
    • 2020-01-15
    • 1970-01-01
    • 1970-01-01
    • 2014-11-03
    • 2013-06-23
    • 2014-04-22
    • 2010-10-16
    • 2015-07-14
    • 2020-01-25
    相关资源
    最近更新 更多