在C ++中读取未知编码的文本文件

时间:2011-10-24 07:59:53

标签: c++ file-io utilities

我应该使用什么来阅读我不知道其编码(ASCII或Unicode)的文本文件?

是否有某些类会自动检测编码?

3 个答案:

答案 0 :(得分:6)

我只能在这里给出否定答案:没有通用的正确方法来确定文件的编码。 ASCII文件可以作为ISO-8859-15编码读取,因为ASCII是一个子集。更糟糕的是,其他文件可能在两种具有不同含义的不同编码中有效。所以你需要通过其他方式获取这些信息。在许多情况下,假设一切都是UTF8是一个很好的方法。如果您正在使用* NIX环境,则LC_CTYPE变量可能会有所帮助。如果您不关心编码(例如,您不更改或处理内容),则可以将文件打开为二进制文件。

答案 1 :(得分:1)

在一般情况下这是不可能的。如果文件包含确切的 我在这里输入的字节,它同样有效,如ASCII,UTF-8或任何 ISO 8859变种。可以使用几种启发式方法作为猜测, 但是:读取第一个“页面”(512字节左右),然后,在下面 订单:

  1. 查看该块是否以其中一个Unicode中的BOM开头 格式
  2. 查看前四个字节。如果它们包含''\ 0'`,你很可能 根据以下内容,处理某种形式的UTF-16或UTF-32 图案: '\0', other, '\0', other utf16be应按 other, '\0', other, '\0' utf16le应按 '\0', '\0', '\0', other UTF32BE other, '\0', '\0', '\0' UTF32RLE
  3. 查找顶部位设置的字节。如果这是合法的开始 UTF-8字符,那么该文件可能是UTF-8。否则......在 在我工作的地区,ISO 8859-1通常是最好的 猜测。
  4. 否则,你或多或少都要假设ASCII,直到你 遇到一个顶部位设置的字节(在这一点上,你使用 以前的启发式)。
  5. 但正如我所说,这不是100%肯定。

    (PS。如何在此处格式化表格。第2点中的文字声明为 一个HTML表,但它似乎没有显示为一个。

答案 2 :(得分:0)

其中一种做法(蛮力)可以是

  • 建立了一个合适的编码列表(只有iso-codepages和unicode)
  • 迭代所有考虑过的编码
  • 使用此编码对文字进行编码
  • 将其编码回Unicode
  • 比较错误的结果
  • 如果没有错误记住产生最少字节的编码

参考:http://www.codeproject.com/KB/recipes/DetectEncoding.aspx

如果您确定传入的编码是ANSI或Unicode,那么您也可以检查byte order mark。但是,让我告诉你,这不是完全证明。