如何使用 C++ 识别文件内容是 ASCII 还是二进制?
最佳答案
如果文件只包含十进制字节 9–13、32–126,则它可能是纯 ASCII 文本文件。否则,它不是。但是,它可能仍然是另一种编码的文本。
如果在除了上述字节之外,该文件包含仅十进制字节 128–255,它可能是一个 8 位或变量的文本文件 -长度 基于 ASCII 的编码,例如 ISO-8859-1、UTF-8 或 ASCII+Big5。如果不是,出于某些目的,您可能可以在这里停下来并认为该文件是二进制文件。但是,它可能仍然是 16 位或 32 位编码的文本。
如果文件不符合上述限制,请检查文件的前 2-4 个字节是否有 byte-order mark :
- 如果前两个字节是十六进制
FE FF
,则文件暂时是UTF-16 BE。 - 如果前两个字节是十六进制
FF FE
,后面两个字节是not十六进制00 00
,则文件为暂定 UTF-16 LE。 - 如果前四个字节是十六进制
00 00 FE FF
,则文件暂定为UTF-32 BE。 - 如果前四个字节是十六进制
FF FE 00 00
,则文件暂时是UTF-32 LE。
如果通过上述检查,您已经确定了一个暂定编码,那么只检查下面对应的编码,以确保该文件不是恰好匹配字节顺序标记的二进制文件。
如果您尚未确定暂定编码,则该文件可能仍然是其中一种编码的文本文件,因为字节顺序标记不是强制性的,因此请检查以下列表中的所有编码:
- 如果文件仅包含十进制值为 9-13、32-126 和 128 或以上的大端双字节字,则该文件可能是 UTF-16 BE。<
- 如果文件仅包含十进制值为 9-13、32-126 和 128 或以上的 little-endian 两字节字,则该文件可能是 UTF-16 LE。<
- 如果文件仅包含十进制值为 9–13、32–126 和 128 或以上的大端四字节字,则该文件可能是 UTF-32 BE。<
- 如果文件仅包含十进制值为 9-13、32-126 和 128 或以上的小端四字节字,则该文件可能是 UTF-32 LE。<
如果在所有这些检查之后,您仍未确定编码,则该文件不是我所知道的任何基于 ASCII 编码的文本文件,因此对于大多数目的,您可能会认为它是二进制文件(它可能仍然是非 ASCII 编码(例如 EBCDIC)的文本文件,但我怀疑这超出了您的关注范围)。
关于c++ - 如何将文件内容识别为 ASCII 或二进制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/277521/