判断MIME类型是二进制还是文本格式

8 投票
3 回答
3108 浏览
提问于 2025-04-16 05:07

有没有一个库可以用来判断某种内容类型是二进制的还是文本的呢?

显然,text/* 这种类型的内容肯定是文本的。但是像 application/jsonimage/svg+xml 甚至 application/x-latex 这些类型,就比较复杂了,因为光看类型名并不能确定它们的实际内容,得查看具体的数据才能知道。

3 个回答

2

通常,能够判断MIME类型的程序也会告诉你字符集是什么。例如,file(1)(以及相关的libmagic库)会给出以下输出:

> file --mime-encoding /bin/ls
/bin/ls: binary
> file --mime-encoding /etc/passwd
/etc/passwd: us-ascii
5

我不知道有没有一个明确的二进制和非二进制MIME类型的列表,但对于常见的MIME类型,我觉得下面这个列表还不错。

def is_binary(mime_type, subtype):
    if mime_type == "text":
        return False
    if mime_type != "application":
        return True
    return subtype not in ["json", "ld+json", "x-httpd-php", "x-sh", "x-csh", "xhtml+xml", "xml"]
2

有一个叫做pymagic的库,可以在Python中使用libmagic,这个方法是实现你想要的功能最简单的方式。需要注意的是,magic的效果取决于文件的指纹。如果一个文件看起来像另一种格式,可能会出现误判,但大多数情况下,pymagic能满足你的需求。

有一点需要留意的是,简单地检查文件中是否有字符超出了可打印的ASCII范围,这种方法可能不太靠谱。因为你可能会遇到Unicode字符,它们看起来像二进制文件(实际上也可能是二进制),但其实只是文本内容。

撰写回答