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

时间:2019-02-20 17:39:03

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

我需要检测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,但运气不佳。

2 个答案:

答案 0 :(得分:2)

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

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

例如,在ISO 8859-15中,是欧元符号0xA4。在ISO 8859-1,CP1252和Unicode中,¤是国际货币符号0xA4。因此,如果您的文件包含class GridLayout<T> extends React.Component<VideoLayoutProps<T>> ,则无法确定它是ISO 8859-15,ISO 8859-1,CP1252,UTF-16中字符的一半,UTF中字符的四分之一-32,UTF-8中多字节序列的中间,或其他多种可能性之一。

答案 1 :(得分:-1)

您始终可以切断BOM并在没有它的情况下处理文件。 This描述了如何完成。