在Ruby中,如何可靠地检测文件的编码(包括没有BOM的UTF-16)?

问题描述 投票:0回答:2

我需要在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.还尝试了rchardetcharlock_holmes,没有太多运气。

ruby character-encoding utf-16 utf-16le
2个回答
2
投票

无法可靠地检测文本文件的编码。你必须被告知带外编码是什么。

原因很简单:有大量的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中多字节序列的中间位置,或许多其他可能性之一。


-1
投票

您可以随时关闭BOM并处理文件。 This描述了如何做到这一点。

© www.soinside.com 2019 - 2024. All rights reserved.