我有一个读取文本文件的 C++ 程序。目前我正在使用 Cfopen()
读取然后fgetc()
读取下一个字符。我typedef
是“文件字符”,它实际上是一个int
(我可以long
毫无问题地更改它,显然)。
现在程序可以读取 UTF-7 和 UTF-8 文本文件,但是如果我使用 UTF-16 或 UTF-32 文本文件呢?有没有办法推断文件编码然后正确读取文件?即使传递给 C++ 的istream
's 也不是问题。
对于任意字节流,没有办法可靠地计算出来。您可以以相同的方式打开二进制可执行文件,该文件未以任何上述编码方式进行编码。
你能做的就是尝试猜测。将文件视为二进制文件并读取前 10k 字节或类似的内容,然后将字节值的分布与您构建的一些规范模型进行比较,看看哪个最接近,然后使用那个。
要构建这样一个模型,您可以获取一些文本(您已经拥有的内容或从维基百科复制的一些文章)使用各种编码对它们进行编码,并运行相同的算法来构建分布。平均结果并将其用作规范模型进行比较。当您倾向于使用相同类型的文本时效果最佳(即,如果您使用纯英文文本构建模型,则可能难以使用非 ascii 字符对文档进行分类)。
如果您的文件有一个字节顺序标记,它会有很大帮助。
虽然您不能绝对推断,但在实践中,您可能会根据编码列表尝试并失败。
此外,允许(但不是必需) utf 文件存储字节顺序标记:https ://en.wikipedia.org/wiki/Byte_order_mark 。如果你有它,你很幸运,因为这在编码中是不同的。