File 如何检查文件是否基于文本?

File 如何检查文件是否基于文本?,file,text,encoding,text-files,File,Text,Encoding,Text Files,我正在开发一个小的文本替换应用程序,它基本上允许用户选择一个文件并替换其中的文本,而无需打开文件本身。但是,我想确保该函数只对基于文本的文件运行。我原以为可以通过检查文件的编码来实现这一点,但我发现Notepad.txt文件使用Unicode UTF-8编码,MS Paint.bmp文件也使用Unicode UTF-8编码。有没有一种简单的方法可以在不限制文件扩展名的情况下检查这个问题?文本文件包含文本,对吗?因此,如果一个文件只包含文本,检查它是否包含字母数字字符是一种非常简单的方法 因此,基

我正在开发一个小的文本替换应用程序,它基本上允许用户选择一个文件并替换其中的文本,而无需打开文件本身。但是,我想确保该函数只对基于文本的文件运行。我原以为可以通过检查文件的编码来实现这一点,但我发现Notepad.txt文件使用Unicode UTF-8编码,MS Paint.bmp文件也使用Unicode UTF-8编码。有没有一种简单的方法可以在不限制文件扩展名的情况下检查这个问题?

文本文件包含文本,对吗?因此,如果一个文件只包含文本,检查它是否包含字母数字字符是一种非常简单的方法

因此,基本上,您要做的第一件事是检查文件编码是否为纯ASCII。您有一个简单的任务,只需将整个文件读入一个字符数组(我假设您是在C/C++或类似的语言中完成的)并使用函数检查数组中的每个字符,当然,您必须注意特殊异常,如制表符“\t”空格”或换行符(“\n”在linux中,\r'\'n”在windows中)


在不同编码的情况下,过程是相同的,只是您必须使用不同的函数来检查当前字符是否为字母数字字符。。。还要注意的是,在UTF-16或更高的情况下,一个简单的字符数组非常小……但是如果你在C中这样做,你不必担心大小:)

文本文件包含文本,对吗?因此,如果一个文件只包含文本,检查它是否包含字母数字字符是一种非常简单的方法

因此,基本上,您要做的第一件事是检查文件编码是否为纯ASCII。您有一个简单的任务,只需将整个文件读入一个字符数组(我假设您是在C/C++或类似的语言中完成的)并使用函数检查数组中的每个字符,当然,您必须注意特殊异常,如制表符“\t”空格”或换行符(“\n”在linux中,\r'\'n”在windows中)


在不同编码的情况下,过程是相同的,只是您必须使用不同的函数来检查当前字符是否为字母数字字符。。。还要注意的是,在UTF-16或更高版本的情况下,简单的字符数组非常小……但是如果你在C#中这样做,你不必担心大小:)

确定一个文件是否基于文本(即二进制文件)的成本非常高。无论文件编码如何,您都必须检查文件中的每个字节以确定它是否为有效字符。

确定文件是否基于文本(即二进制文件)的成本相当高。无论文件编码如何,您都必须检查文件中的每个字节以确定它是否为有效字符。

您可以编写一个函数,尝试确定文件是否基于文本。虽然这不是100%准确,但对你来说可能已经足够了。这样的函数不需要遍历整个文件,大约一个KB就足够了(甚至更少)。要做的一件事是计算有多少空格和换行符。另一件事是考虑单个字节并检查它们是否是字母数字。通过一些实验,你应该能够得到一个合适的函数。请注意,这只是一种基本方法,文本编码可能会使事情变得复杂。

您可以编写一个函数,尝试确定文件是否基于文本。虽然这不是100%准确,但对你来说可能已经足够了。这样的函数不需要遍历整个文件,大约一个KB就足够了(甚至更少)。要做的一件事是计算有多少空格和换行符。另一件事是考虑单个字节并检查它们是否是字母数字。通过一些实验,你应该能够得到一个合适的函数。请注意,这只是一种基本的方法,文本编码可能会使事情变得复杂。

除非你从某个地方得到一个巨大的提示,否则你会陷入困境。纯粹通过检查字节,如果编码过多(“ASCII”、Unicode、UTF-8、DBCS、MBCS等),您就有可能猜错。哦,如果第一个页面看起来像ASCII,但下一个页面是指向第一个页面的btree节点,该怎么办

提示可以是:

  • 扩展名(foo.exe不太可能是可编辑的)
  • 流本身中的某些内容(如BOM[字节顺序标记])
  • 用户方向(只需编辑文件,goshdarnit)
Windows过去提供一个API ISTEXTINCODE来进行概率检查,但也存在众所周知的误报


我的看法是,试图比用户更聪明有一些问题…

除非你从某个地方得到一个巨大的提示,否则你会被卡住。纯粹通过检查字节,如果编码过多(“ASCII”、Unicode、UTF-8、DBCS、MBCS等),您就有可能猜错。哦,如果第一个页面看起来像ASCII,但下一个页面是指向第一个页面的btree节点,该怎么办

提示可以是:

  • 扩展名(foo.exe不太可能是可编辑的)
  • 流本身中的某些内容(如BOM[字节顺序标记])
  • 用户方向(只需编辑文件,goshdarnit)
Windows过去提供一个API ISTEXTINCODE来进行概率检查,但也存在众所周知的误报


我的看法是,试图比用户更聪明会有一些问题…

其他人说要查看文件中的所有字节,看看它们是否是字母数字。一些UNIX/Linux UTIL会这样做,但只需检查文件的前1K或2K,作为“乐观优化”。

其他人说要查看文件中的所有字节,看看它们是否为字母数字。一些UNIX/Linux UTIL可以做到这一点,但只需检查第一个1KO