在C ++中编码独立的输入流

时间:2016-06-15 19:10:52

标签: c++ encoding utf-8 utf-32

我有一个读取文本文件的C ++程序。目前,我使用C' fopen()阅读,然后fgetc()阅读下一个字符。 我typedef' da"文件字符",实际上是int(我可以毫无问题地将其更改为long)。

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

2 个答案:

答案 0 :(得分:0)

没有办法可靠地为任意字节流弄清楚它。您可以以二进制可执行文件的相同方式打开,该文件未以任何提及的编码进行编码。

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

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

如果您的文件有byte order mark,则会有很大帮助。

答案 1 :(得分:0)

虽然你无法推断,但实际上,你可能会根据编码列表尝试失败。

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

此外,允许(但不要求)utf文件存储字节顺序标记:https://en.wikipedia.org/wiki/Byte_order_mark。如果你拥有它,那么你很幸运,因为编码之间有所不同。