ContentType和MimeType有什么区别?

133
据我所知,这两个术语是完全相等的。但在浏览一些Django文档时,我发现了下面这段代码:

HttpResponse.__init__(content='', mimetype=None, status=200, content_type='text/html')

这让我很惊讶,因为这两个参数看起来很像。正式的文档以实用的方式解决了这个问题:

content_type是mimetype的一个别名。 在历史上,这个参数只被称为mimetype, 但由于它实际上是HTTP Content-Type头中包含的值, 它还可以包括字符集编码,这使它不仅仅是MIME类型规范。 如果指定了mimetype(不是None),则使用该值。 否则,将使用content_type。 如果都没有给出,则使用DEFAULT_CONTENT_TYPE设置。

然而,我认为这并不能阐明问题。为什么我们要对(几乎相同的)东西使用两个不同的名称?“Content-Type”只是在浏览器请求中使用的一个名称吗?除此之外,它几乎没有其他用途吗? 这两个名称之间的主要区别是什么?在什么情况下使用mimetype而不是content-type?我是小题大做还是语法纠正狂?
4个回答

76

我一直认为contentType是mimeType的超集。唯一的区别是可选的字符集编码。如果contentType不包括可选的字符集编码,则它与mimeType相同。否则,mimeType是字符集编码序列之前的数据。

例如:text/html; charset=UTF-8

text/html 是mimeType
; 是附加参数指示符
charset=UTF-8 是字符集编码参数

例如:application/msword

application/msword 是mimeType
它不能具有字符集编码,因为它描述的是一个不直接包含字符的良好形式的octet-stream


1
这是正确的答案。设置响应mime_type(而不是content_type)不会覆盖字符集,它仍然保持为UTF-8。 - Mikko Ohtamaa
有时候简称为“媒体类型”,MIME类型就是所说的媒体类型。在某些规范中,我们会看到术语“可解析的MIME类型”,其中包括使用Content-Type头中的属性。Content-Type的语法可以在此处找到:https://tools.ietf.org/html/rfc2045#section-5.1 - vhs
然而,在我看来,MIME类型是一个非常狭窄的术语,仅限于邮件,而内容类型则是“内容类型”的普通英语。因此,在我看来,“text/html”也是一种内容类型,即使人们倾向于称其为MIME。此外,新名称“媒体类型”甚至更加模糊,因为媒体有100种不同的东西。BBC是一种媒体!DVD是一种媒体!人们会认为数据流不是“媒体”,而是“介质”。 - user2173353

63
为什么对(几乎相同的)东西使用两种不同的命名方式?“Content-Type”只是浏览器请求中使用的名称,并且在其之外很少使用,每个名称之间的主要区别是什么,在什么情况下称为MIME类型或内容类型?我是不是在太在意细节了? 原因不仅仅是向后兼容性,恐怕通常优秀的Django文档有点含糊不清。MIME (至少应该阅读一下维基百科条目)起源于扩展互联网邮件,特别是SMTP。从那里,MIME和受其启发的扩展设计已经进入了许多其他协议(例如HTTP),并且在现有协议中传输新类型的元数据或数据时仍在使用。有数十个RFC讨论用于各种目的的MIME。
具体而言,Content-Type:是几个MIME头之一。 "Mimetype"确实听起来已经过时,但对MIME本身的引用不会过时。如果您愿意,请将其称为向后兼容性。
[顺便说一句,这纯粹是一个术语问题,与语法完全无关。将每个用法问题都归类为“语法”是我的爱好。咆哮。]

4

如果您想了解详情,请查看3526票。

引用:

将content_type作为mimetype的别名添加到HttpResponse构造函数中。这是一个稍微更准确的名称。基于Simon Willison的补丁。完全向后兼容。


0
为什么我们对于(几乎相同的)事物使用两种不同的命名方式?
根据您从文档中引用的内容,这是为了向后兼容。

没问题,我理解在Django中添加这个的实际原因。然而,问题的核心是为什么每个人都如此混用这两个词,以及是否真的有区别。 - Frangossauro

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接