我需要在Ruby中检测文件类型和编码。
我目前正通过magic gem使用libmagic,但它有一个问题:如果它们没有BOM,它不会检测到UTF-16文件。 This就是这种文件的一个例子。
$ file -i text_without_bom.txt
text_without_bom.txt: application/octet-stream; charset=binary
我可以使用任何其他可以正确检测UTF-16文件的库或方法吗?
P. S.还尝试了rchardet和charlock_holmes,没有太多运气。
无法可靠地检测文本文件的编码。你必须被告知带外编码是什么。
原因很简单:有大量的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并处理文件。 This描述了如何做到这一点。