0

我有一个读取文本文件的 C++ 程序。目前我正在使用 Cfopen()读取然后fgetc()读取下一个字符。我typedef是“文件字符”,它实际上是一个int(我可以long毫无问题地更改它,显然)。

现在程序可以读取 UTF-7 和 UTF-8 文本文件,但是如果我使用 UTF-16 或 UTF-32 文本文件呢?有没有办法推断文件编码然后正确读取文件?即使传递给 C++ 的istream's 也不是问题。

4

2 回答 2

0

对于任意字节流,没有办法可靠地计算出来。您可以以相同的方式打开二进制可执行文件,该文件未以任何上述编码方式进行编码。

你能做的就是尝试猜测。将文件视为二进制文件并读取前 10k 字节或类似的内容,然后将字节值的分布与您构建的一些规范模型进行比较,看看哪个最接近,然后使用那个。

要构建这样一个模型,您可以获取一些文本(您已经拥有的内容或从维基百科复制的一些文章)使用各种编码对它们进行编码,并运行相同的算法来构建分布。平均结果并将其用作规范模型进行比较。当您倾向于使用相同类型的文本时效果最佳(即,如果您使用纯英文文本构建模型,则可能难以使用非 ascii 字符对文档进行分类)。

如果您的文件有一个字节顺序标记,它会有很大帮助。

于 2016-06-15T19:28:43.497 回答
0

虽然您不能绝对推断,但在实践中,您可能会根据编码列表尝试并失败。

  • UTF-16 很可能很早就有一个 '\0' (无论是在偶数还是奇数位置由字节序决定,字节序可能是小,大,或者在某些架构上,中等);
  • UTF-32 可能会有其中的三个;尽管
  • UTF-8 字符串不应包含此字符。

此外,允许(但不是必需) utf 文件存储字节顺序标记:https ://en.wikipedia.org/wiki/Byte_order_mark 。如果你有它,你很幸运,因为这在编码中是不同的。

于 2016-06-15T19:28:54.237 回答