在Ruby中,如何可靠地检测文件&x27;s编码(包括不带BOM的UTF-16)?

在Ruby中,如何可靠地检测文件&x27;s编码(包括不带BOM的UTF-16)?,ruby,character-encoding,utf-16,utf-16le,Ruby,Character Encoding,Utf 16,Utf 16le,我需要检测Ruby中的文件类型和编码 我目前正在通过gem使用libmagic,但它有一个问题:如果UTF-16文件没有BOM,它不会检测到它们。是此类文件的一个示例 $ file -i text_without_bom.txt text_without_bom.txt: application/octet-stream; charset=binary 我是否可以使用其他库或方法来正确检测UTF-16文件 另外,也尝试过,但运气不太好。您总是可以在不使用BOM表的情况下切断BOM表并处理文件。

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

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

$ file -i text_without_bom.txt
text_without_bom.txt: application/octet-stream; charset=binary
我是否可以使用其他库或方法来正确检测UTF-16文件


另外,也尝试过,但运气不太好。

您总是可以在不使用BOM表的情况下切断BOM表并处理文件。
描述如何执行此操作。

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

原因很简单:有大量的8位编码。在这些编码中,8位的每个组合都是有效字符。由于8位的每个组合在每个8位编码中都是有效字符,因此任何任意文本文件,实际上任何任意文件在任何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中的多字节序列的中间,还是许多其他可能的文件之一,但是它仍然有局限性。尝试使用编码。列出你所面临的问题。问题是,我已经没有BOM了,没有BOM,字符检测库无法理解它是UTF-16。它是否总是没有BOM的UTF-16?不,它可能是没有BOM的UTF-16。它总是UTF-16吗?不,它真的可能是任何东西。