什么是字体文件的正确MIME类型?

7
我找不到一个权威的来源来指示任何或每种文件格式的正确MIME类型。我找到的所有来源似乎相互矛盾,或与 IANA MIME类型RFC及其相关列表不符。
虽然我特别关注.otf(OpenType)和.ttf(TrueType)文件类型,但理想的答案应该提供一个规范资源,用于确定广泛的字体文件格式的MIME类型,例如在维基百科页面的文件格式列表中的字体文件部分中列出的那些。然而,鉴于我找不到这样的资源,似乎完全有可能不存在这样的规范参考。
我希望进一步澄清,我不是在寻找工作的MIME类型,而是标准的MIME类型。Proper MIME type for fonts 中所选答案指出,可以使用font/opentype来表示.otf文件。然而,最高票答案(由@djsadinoff提供)解释道,font不是有效的IANA内容类型,因此这不能是正确的MIME类型。

1
自2017年以来,这个问题已经有了官方答案。这是一个温和的提示,建议您接受它。 - TRiG
5个回答

7
针对您的问题,您可能不了解字体类型的事实。请使用此链接Font MIME Types
roc在Web Fonts战斗中报告了短版,即非IE浏览器是否应支持字体的DRM格式。(也许还包括它们是否可以直接支持TrueType和OpenType。)我真的不认为我们应该支持字体的DRM格式。这似乎会在Web上树立一个不良先例,如果他们没有正确执行,可能会使供应商承担责任,并且会给作者带来复杂的问题。
W3C已经为EOT工作组创建了草案章程; EOT(嵌入式开放字体)是微软正在倡导的DRM格式。我不知道EOT如何将Web引向其充分潜力,但我们将看到其结果。
除了格式问题外,考虑引入字体的MIME类型可能值得一试。 (如果这对于实现来说太晚了,那么就可能太晚了。)好处是任意文件(例如,text / html文件)将不会被解释为字体。缺点是这使得作者的工作稍微困难了一些,因为他们必须确保正确标记它。(在Web上,图像(除SVG外)和JavaScript不会检查资源是否具有正确的MIME类型。对于图像,浏览器会嗅探图像签名,并且从脚本元素加载的内容仅执行(确实不太好)。)
考虑到Opera,Safari和Firefox将很快发布支持@font-face,这需要尽快决定。可能要在相关MIME类型通过IETF进行标准化之前做出决策。另一个复杂因素是OpenType和TrueType可以携带otf和ttf作为扩展名,操作系统可以很好地处理它。为两者提供单个MIME类型可能是可行的,就像XHTML和SVG都可以使用text / xml一样。

5
缺乏特定的字体文件媒体类型导致了上述混乱、不断变化和矛盾的局面,正如smartcaveman所描述的那样。除了IANA列表以外,在2012年之前,这个问题实际上是无法回答的,因为没有这样一个规范参考存在。幸运的是,这种情况已经得到纠正...
在今年二月份(2017年),W3C发布了Standards TrackRFC 8081: The "font" Top-Level Media Type,大大简化了字体文件的适当媒体类型:

此备忘录用于注册和记录“font”顶级媒体类型,其中可以注册字体表示格式的子类型。本文档还作为一组预期子类型的注册申请,这些子类型代表了一些现有子类型的代表性,这些子类型已经在其单独的注册中由“application”树注册。

这是一份易读的文件,它描述了历史背景(缺乏“字体格式注册”),这导致了媒体类型和子类型混淆。随着可下载网络字体的相对普及,W3C认识到需要一个“直观的顶级字体类型”。他们提出的是:font
因此,IANA已经更新了他们的正式媒体类型列表,包括他们当前认可的font媒体类型及其所有子类型。
collection  font/collection
otf     font/otf
sfnt    font/sfnt
ttf     font/ttf
woff    font/woff
woff2   font/woff2

4

你的答案在规范中。

4.5.1. 八位字节流子类型

"octet-stream"子类型用于指示正文包含任意二进制数据。

同一份文件的第4页也有相关内容。

(5)   application -- some other kind of data, typically
      either uninterpreted binary data or information to be
      processed by an application.  The subtype "octet-
      stream" is to be used in the case of uninterpreted
      binary data, in which case the simplest recommended
      action

我仍然不确定这个文件是否是二进制数据,所以我使用Linux的file()命令检查了它的MIME类型。

    $ file --mime-type 
    Days-webfont.ttf: application/octet-stream

这是一个八位字节流,非常清晰明了!

虽然如此,我仍然有一些疑虑,所以我需要更多的资源。浏览器将如何解释这个?Mozilla在这里提供了一些帮助...

注意:由于TrueType、OpenType和Web Open文件格式(WOFF)字体没有定义MIME类型,因此不考虑指定文件的MIME类型。

有趣的是,Mozilla表示ttf、otf或woff没有定义MIME类型

Mozilla也提供了一些帮助资源

确定您内容的正确MIME类型

如何确定您内容的正确MIME类型

有几个步骤可以确定要用于您内容的正确MIME类型值。

如果您的内容是使用供应商的软件应用程序创建的,请阅读供应商的文档,查看应该为不同媒体类型报告哪些MIME类型。

查看包含所有已注册MIME类型的IANA | MIME媒体类型注册表。

如果媒体类型使用Netscape Gecko中的插件显示,请安装插件,然后在“帮助”->“关于插件”菜单中查看与媒体类型相关联的MIME类型。

在FILExt或文件扩展名参考中搜索文件扩展名,以查看与该扩展名相关联的MIME类型。

我不建议您访问FILExt页面或文件扩展名参考,因为它们无法完成bash中file()所不能完成的任何操作。

通过文档搜索,我找到了各种几乎符合要求的应用程序子类型;vnd.ms-fontobject,但那只适用于.eot文件,font-tdpfr,但那只适用于.pfr文件。

因此,规范似乎没有具体说明

我相信了。 所以,我想您的规范资源将是将file()的输出与规范中的内容进行比较。


application/octet-stream 是一个通用的万能类型。问题在于它并不能向客户端指示文件的任何信息。它只是所有包含二进制数据的文件类型的超类。(例如,您可以将 PDF 标记为 application/octet-stream,但其具体类型是 application/pdf - smartcaveman
好的,我明白,但是我们现在确实没有application/octet-stream规范。 - noel
我并不认为你是错的,只是希望有些东西我们都没有发现。 - smartcaveman
@shakabra是正确的。你应该使用application/octet-stream,因为它适用于所有类型的二进制数据。试图“发明”自己的MIME类型将不会产生任何好处。 - Martin Müller

2
作为其中一条评论所述:

更好的 MIME 类型应该是 "application/x-font-opentype" 或者 "application/octet-stream"。第一个基本上是“未注册的此名称的 MIME 类型”,第二个只是“二进制数据”

任何一个都在技术上是正确的,因为第一个是非官方类型的接受 MIME 类型格式,第二个是没有更具体的官方 MIME 类型的二进制数据的通用 MIME 类型。我根据 RFC2046 对这种说法进行了验证,似乎是正确的。在某种类型成为官方类型之前,最正确的方法是使用非官方类型的接受格式或使用通用类型。

1

目前,OpenType和TrueType似乎没有任何特定的“正确”MIME类型。

然而,Web开放字体格式可以用作两者的包装器,其MIME类型为application/font-woff(由W3C注册)。嵌入式OpenType格式是OpenType的紧凑版本,使用application/vnd.ms-fontobject(由Microsoft注册)。

如果您想回到过去,可以使用application/font-tdpfr来获取TrueDoc便携式字体资源。这在Netscape Navigator 4中得到了本地支持。☺


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