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