【问题标题】:How to verify if a file is readable by humans?如何验证文件是否可以被人类读取?
【发布时间】:2015-09-07 17:08:00
【问题描述】:

我如何确保文件可供人类阅读。

我基本上想检查文件是否是txtymldocjson 文件等等。

问题是,在我想要执行此检查的情况下,文件扩展名具有误导性,我的意思是纯文本文件(应该是 .txt)具有.d 和其他各种扩展名: - (

验证文件是否可以被人类读取的最佳方法是什么?

到目前为止,我已经尝试了以下扩展:

private boolean humansCanRead(String extention) {
        switch (extention.toLowerCase()) {
        case "txt":
        case "doc":
        case "json":
        case "yml":
        case "html":
        case "htm":
        case "java":
        case "docx":
            return true;
        default:
            return false;
        }
    }

但正如我所说,扩展并不像预期的那样。

编辑:澄清一下,我正在寻找一个独立于平台且不使用外部库的解决方案,为了缩小我的意思是“人类可读”,我的意思是包含任何语言字符的纯文本文件,我也是真的不介意文件中的文本是否像编码一样有意义,我现在并不关心。

到目前为止,感谢您的所有回复! :D

【问题讨论】:

  • 我无法阅读 docx 和 doc。 (事实上​​我的电脑也不能。)
  • 您可以尝试使用 Apache Tika 获取文件类型(根据内容)。
  • ...我能想到几个我也无法阅读的 .txt 文件。 (例如,我敢打赌有一些法语。)我想说的是,不可能按照您的定义准确地实现此方法。
  • @RishavKundu 是的,甚至字符和编码也不同,这就是让这个问题变得异常困难的原因。另一方面,找出某个文件包含某个地方的某个人可能能够阅读的文本又有什么意义呢?如果您的用户无法阅读文本,那么对于他们来说,地球上有人可以阅读,这对他们来说并不是什么安慰。这就是为什么我认为这完全是错误的问题。您应该询问您的用户他们可以阅读哪些内容,并且只搜索那些语言/文件类型,这是一项容易得多的任务。
  • @fillpant 但是字符符号和字节。您可以使用某些技巧(例如检查文件是否是有效的 UTF-8 序列或给定百分比的字节是否在 32-127 的 ASCII 可打印范围内),但它永远不会涵盖所有编码和所有语言100% 准确。

标签: java file


【解决方案1】:

一般来说,你不能这样做。您可以使用 language identification algorithm 来猜测给定文本是否是人类可以说出的文本。但是,由于您的示例包含诸如 html 之类的正式语言,因此您遇到了很大的麻烦。如果您真的想实现对(有限的)形式语言的检查,您可以使用GLR parser 来解析组合所有这些语言的(不明确的)语法。然而,这还不能解决语法错误的问题(尽管可以定义启发式)。最后,您需要考虑“人类可读”的实际含义:例如你包括Base64吗?

编辑:如果您只对字符集感兴趣:请参阅this questions' answer。基本上,您必须阅读文件并检查内容在您认为人类可读的任何字符编码中是否有效(utf-8 应该涵盖大多数实际情况)。

【讨论】:

  • 谢谢,人类可读的意思是一个包含纯文本的文件,我不介意它是否可以理解,比如它是“FEWRREWGAERGVS”或“你好吗”我需要担心关于以后。现在我想排除除包含纯文本的文件之外的所有内容。不过你的回答很有启发性!泰!但我仍然需要这种分离。同样正如我在上面的评论中提到的,这些文件可能是任何语言。 :D
  • 好的,编辑也有帮助,但正如我在上面发布的那样^“我已经制作了一个预览面板,其中可读文件将显示为一个小预览,但如果它们的预览看起来像“PK «L~F ώΚ σMΜΛLK-.Ρ K-*ΞΜΟ³R0Τ3ΰεβε PK²ξ",虽然这些是有效的希腊字符,但它不是理想的 D:" :- (
【解决方案2】:

对于某些文件,检查可打印 ASCII 范围内的字节比例会有所帮助。如果超过 75% 的字节在前几百字节的范围内,那么它可能是“可读的”。

有些文件有标题,例如 UTF 文件上各种形式的 BoM,启动 MS doc 文件的 0xA5EC 或 .exe 开头的“MZ”签名,它将告诉您文件是否可读。

许多现代文本文件采用其中一种 UTF 格式,通常可以通过读取文件的第一个块来识别,即使它们没有 BoM。

基本上,您将不得不运行许多不同的文件类型来查看是否匹配。将文件的第一个 KB 加载到内存中并对其运行许多不同的检查。获得一些数据后,您可以订购检查以首先查找最常见的格式。

【讨论】:

  • 谢谢!这就是我所需要的,我将开发一个算法来检查这些:-) 我不知道这样的标题在哪里:3
  • 为了找到标题字节,我用谷歌搜索了“XXX 文件格式”以获取各种 XXX 值。
  • 嗯,我也看过了,但对于所有支持的文件类型来说,这是一个巨大的实现。 :3 非常感谢 :D
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-23
  • 2023-01-18
  • 2014-12-16
  • 2011-06-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多