[45] [[MIME型]]の[DFN[[RUBYB[構造化構文接尾辞]@en[structured syntax suffix]]]]は、
その[[MIME型]]が用いている一般的な構文 ([[構造化構文]]、[[メタ書式]]) 
を表すものです。 [[MIME型]]の末尾に [CODE(MIME)[[[+]]]]
で区切って記述します。[[構造化構文接尾辞]]は、[[MIME型]]の一部です。

[EG[
[46] 例えば [[MIME型]] [CODE(MIME)@en[[[image/svg+xml]]]] では、末尾の
[CODE(MIME)@en[[[+xml]]]] が[[構造化構文接尾辞]]です。 [[MIME型]]全体では [[SVG]]
を表しますが、[[構造化構文接尾辞]]は [[XML]] を表しており、 [[SVG]]
としての処理に対応していなかったとしても、 [[XML]] としての処理には対応していれば、
そのレベルでこの [[MIME型]]を理解できることになります。
]EG]

[2] >>1 は用語が長過ぎるとして[DFN[[RUBYB[+接尾辞]@en[+suffix]]]]と呼んでいます。

* 仕様書

[REFS[
- [47] [CITE@en[RFC 6839 - Additional Media Type Structured Syntax Suffixes]] ([TIME[2013-06-28 00:23:48 +09:00]] 版) <http://tools.ietf.org/html/rfc6839>
- [50] [CITE[Structured Syntax Suffix Registry]] ([TIME[2013-09-19 20:22:53 +09:00]] 版) <http://www.iana.org/assignments/media-type-structured-suffix/media-type-structured-suffix.xhtml>
- [53] [CITE@en[RFC 6838 - Media Type Specifications and Registration Procedures]] ([TIME[2014-06-02 03:57:09 +09:00]] 版) <http://tools.ietf.org/html/rfc6838#section-4.2.8>
- [14] [CITE@en[RFC 6838 - Media Type Specifications and Registration Procedures]] ([TIME[2015-02-11 00:35:08 +09:00]] 版) <http://tools.ietf.org/html/rfc6838#section-6>
- [1] [CITE@en[Best Practices for Fragment Identifiers and Media Type Definitions]] ([TIME[2013-04-29 23:11:19 +09:00]] 版) <http://www.w3.org/2001/tag/doc/mimeTypesAndFragids#dfn-suffix>
]REFS]

* 意味

[6] [[MIME型]]の[[部分型]]部分の末尾に [CODE[+]] と[[構造化構文]]の名前を記述できます。

[EG[
[7] 例えば [[SVG]] は [[XML]] を[[構造化構文]]として用いているので、
[CODE(MIME)@en[[[image/svg+xml]]]] という [[MIME型]]を使っています。
[CODE[[[+xml]]]] まで含めて1つの [[MIME型]]です。
]EG]

[8] 名前のある[[構造化構文]]を使う [[MIME型]]は、[[構造化構文接尾辞]]を使う[['''べきです''']]
[SRC[>>53]]。

[32] [[MIME型]]は全体として意味を持つもので、
[[構造化構文接尾辞]]を除いた部分が一致したりしなかったりしても、
そのことに特別な意味はありません。

[EG[
[36] ある[[仕様書]]で [CODE[example/foo+'''xml''']] が定義されたとしても、
[CODE[example/foo+'''json''']] が自動的に定義されることはありません。
両者がまったく異なる意味で用いられる可能性すらあります。
]EG]

[12] [[構造化構文接尾辞]]を複数連ねることができるのかどうかは不明瞭です。

-*-*-

[9] [[MIME型]]は実際に使っていない[[構造化構文接尾辞]]を含めては[['''なりません''']]
[SRC[>>53]]。

[19] [[構造化構文]]を表すために[[構造化構文接尾辞]]を使うことはできますが、
それが義務付けられているわけではありません。

[EG[
[20] [[動画]]や[[音声]]の [[container format]] は[[構造化構文]]の定義に当てはまりそうではありますが、
[[container format]] と [[codec]] の組み合わせに個別に[[MIME型]]を与えることはほとんどありません。
普通は [[container format]] ごとの一般的な [[MIME型]]を使い、
必要に応じて [CODE(MIME)@en[[[codecs]]]] [[引数]]を補うことになっています。
]EG]

-*-*-

[17] いつ[[構造化構文接尾辞]]付き[[MIME型]]を使うべきで、いつ一般的な
[[MIME型]]を使うべきなのか、一般的な規則はなさそうです。

[EG[
[18] 例えば [[XML]] に基づく言語である [[SVG]] は、
[CODE(MIME)@en[[[text/xml]]]] という一般的な [[MIME型]]と
[CODE(MIME)@en[[[image/svg+xml]]]] という専用の [[MIME型]]があります。
[[SVG]] に限れば [CODE(MIME)@en[[[image/svg+xml]]]] とした方が便利そうです。
しかしどちらを使うべきか (そもそも専用の [[MIME型]]を用意するべきか)
の一般的な規則はなさそうです。
]EG]

[37] なお、[[構造化構文接尾辞]]付き[[MIME型]]は[[構造化構文接尾辞]]共通の[[素片識別子]]の規定に従わなければならない
(そうでない場合は[[構造化構文接尾辞]]を使わない [[MIME型]]を使わなければならない)
との規定があります。

;; [[素片識別子]]参照。

* IANA 登録簿

[10] [[構造化構文接尾辞]]の [[IANA登録簿]] [SRC[>>50]]
が ([[MIME型]]登録簿とは別に) あります [SRC[>>53, >>14]]。

[11] 未登録の[[構造化構文接尾辞]]を使う[['''べきではありません''']] [SRC[>>53]]。

;; [15] 現実には、登録されていないものもいくつか使われています。
(逆に登録されているのに使われていなそうなものもあります。)

* 構造化構文接尾辞の一覧

[16] 次のような[[構造化構文接尾辞]]が確認されています。

[FIG(list)[
[29]
,[CODE(MIME)@en[[[[VAR[*]]/[VAR[*]]+asn1]]]]	,[[ASN.1]]	,
,[CODE(MIME)@en[[[[VAR[*]]/[VAR[*]]+ber]]]]     ,[[BER]]
,[CODE(MIME)@en[[[[VAR[*]]/[VAR[*]]+bibtex]]]]	,[[BibTeX]]	,
,[CODE(MIME)@en[[[[VAR[*]]/[VAR[*]]+binary]]]]	,
,[CODE(MIME)@en[[[[VAR[*]]/[VAR[*]]+cbor]]]]    ,[[CBOR]],[CODE(MIME)@en[[[application/cbor]]]]
,[CODE(MIME)@en[[[[VAR[*]]/[VAR[*]]+csv]]]]	,[[CSV]]	,[CODE(MIME)@en[[[text/csv]]]]
,[CODE(MIME)@en[[VAR[*]]/[VAR[*]]+dag+cbor]]
,[CODE(MIME)@en[[[[VAR[*]]/[VAR[*]]+der]]]]     ,[[DER]]
,[CODE(MIME)@en[[[[VAR[*]]/[VAR[*]]+exi]]]]     ,[[EXI]],[CODE(MIME)@en[[[application/exi]]]]
,[CODE(MIME)@en[[[[VAR[*]]/[VAR[*]]+ext]]]]
,[CODE(MIME)@en[[[[VAR[*]]/[VAR[*]]+fastinfoset]]]]	,[[Fast Infoset]]
,[CODE(MIME)@en[[[[VAR[*]]/[VAR[*]]+form]]]]
,[CODE(MIME)@en[[[[VAR[*]]/[VAR[*]]+gzip]]]]	,[[GNU Zip]],[CODE(MIME)@en[[[application/gzip]]]]
,[CODE(MIME)@en[[[[VAR[*]]/[VAR[*]]+hdr]]]]
,[CODE(MIME)@en[[[[VAR[*]]/[VAR[*]]+html]]]]
,[CODE(MIME)@en[[[[VAR[*]]/[VAR[*]]+jpg]]]],[[JPEG]],[CODE(MIME)@en[[[image/jpeg]]]]
,[CODE(MIME)@en[[[[VAR[*]]/[VAR[*]]+i-json]]]],[[I-JSON]]
,[CODE(MIME)@en[[[[VAR[*]]/[VAR[*]]+json]]]]	,[[JSON]],[CODE(MIME)@en[[[application/json]]]]
,[CODE(MIME)@en[[[[VAR[*]]/[VAR[*]]+json-seq]]  ,[[JSON text sequence]],[CODE(MIME)@en[application/json-seq]]
,[CODE(MIME)@en[[VAR[*]]/[VAR[*]]+jwt]],[[JWT]]
,[CODE(MIME)@en[[VAR[*]]/[VAR[*]]+ld+json]]
,[CODE(MIME)@en[[[[VAR[*]]/[VAR[*]]+n3]]]]	,[[N3]],[CODE(MIME)@en[[[text/n3]]]]
,[CODE(MIME)@en[[[[VAR[*]]/[VAR[*]]+ogg]]]]	,[[Ogg]] container format
,[CODE(MIME)@en[[[[VAR[*]]/[VAR[*]]+rcs]]]]	,[[RCS]]
,[CODE(MIME)@en[[[[VAR[*]]/[VAR[*]]+rle]]]]
,[CODE(MIME)@en[[[[VAR[*]]/[VAR[*]]+ruby]]]]
,[CODE(MIME)@en[[[[VAR[*]]/[VAR[*]]+src]]]]
,[CODE(MIME)@en[[VAR[*]]/[VAR[*]]+sqlite3]],,[CODE(MIME)@en[application/vnd.sqlite3]]
,[CODE(MIME)@en[[[[VAR[*]]/[VAR[*]]+swcfg]]]]	,[[SuikaWikiConfig/2.0]]
,[CODE(MIME)@en[[[[VAR[*]]/[VAR[*]]+text]]]]    ,[[テキスト]]
,[CODE(MIME)@en[[[[VAR[*]]/[VAR[*]]+thrift]]]]  ,[[Thrift]]
,[CODE(MIME)@en[[VAR[*]]/[VAR[*]]+tlv]]
,[CODE(MIME)@en[[[[VAR[*]]/[VAR[*]]+yaml]]]]    ,[[YAML]],[CODE(MIME)@en[[[text/yaml]]]]
,[CODE(MIME)@en[[[[VAR[*]]/[VAR[*]]+vrml]]]]	,[[VRML]],[CODE(MIME)@en[[[model/vrml]]]]
,[CODE(MIME)@en[[[[VAR[*]]/[VAR[*]]+wbxml]]]]	,[[WBXML]]
,[CODE(MIME)@en[[[[VAR[*]]/[VAR[*]]+xml]]]]	,[[XML]],[CODE(MIME)@en[[[application/xml]]]]
,[CODE(MIME)@en[[[[VAR[*]]/[VAR[*]]+xml-compressed]]]]
,[CODE(MIME)@en[[[[VAR[*]]/[VAR[*]]+xps]]]]
,[CODE(MIME)@en[[[[VAR[*]]/[VAR[*]]+zip]]]]	,[[Zip]],[CODE(MIME)@en[[[application/zip]]]]
,[CODE(MIME)@en[[[[VAR[*]]/[VAR[*]]+zstd]]]]
]FIG]

[4] [[JSON]] 形式による[[構造化構文接尾辞]]の一覧データファイルが >>3 にあります。

[REFS[
- [3] [CITE@en[data-web-defs/mime-types.txt at master · manakai/data-web-defs]] ([TIME[2015-01-16 14:18:34 +09:00]] 版) <https://github.com/manakai/data-web-defs/blob/master/doc/mime-types.txt>
]REFS]

* 素片識別子

[26] [[素片識別子]]参照。

* 処理

;; [31] 具体的な処理については、各[[構造化構文接尾辞]]の項を参照。

[21] [[構造化構文接尾辞]]は、未知の [[MIME型]]でも[[構造化構文]]がわかれば一般的な処理を適用できるはず、
という前提に基づいています。しかし実際にはその意図通りに実装されているとは限りません。

- [22] 実装によっては、 [[MIME型]]から対応する処理を決定するために、
[[MIME型]]全体の一致を調べていることがあります。
そこに[[構造化構文接尾辞]]だけの末尾一致を組み込むのが難しいとの理由で、
一般的な [[MIME型]]に対応していても[[構造化構文接尾辞]]付きの
[[MIME型]]には対応していない実装も存在しています。
- [23] [[構造化構文]]のみしか対応していない実装は、ほとんど[[利用者]]に有益な情報を提供できないかもしれません。
例えば [[SVG]] に対応していない実装が [[XML]] としての[[木構造]]を提示したところで、
一般[[利用者]]には理解できないため、意味は無いかもしれません。

* 関連

[13] [CODE(MIME)@en[multipart/[VAR[*]]]] は、時代が異なれば[[構造化構文接尾辞]]だったかもしれません。

[40] [CODE[application/senml+xml]] などのシリーズと
[CODE[application/sensml+xml]] などのシリーズは、 [[EXI]] だけ
([[構造化構文接尾辞]]が[[IANA]]に登録されていないためか)
[CODE[application/senml-exi]] と [CODE[application/sensml-exi]]
になっています。

** 他の「[CODE(MIME)[+]]」の用法

[48] [[MIME型]]の中で [CODE(MIME)@en[[[+]]]] という記号は当初から予約されていたものではありませんでしたから、
[[構造化構文接尾辞]]以外の意味で [CODE(MIME)@en[[[+]]]] が使われることもあります。

[34]
[CODE(MIME)@en[[[audio/amr-wb+]]]] というのが登録されています。
[CODE(MIME)@en[[[application/xhtml+voice+xml]]]] には物言いがついたのに。
([[名無しさん]] [WEAK[2006-07-02 03:17:54 +00:00]])

[35]
ちなみに巷で使われているものにはほかに [CODE(MIME)@en[[[application/x-xhtml+voice+xml]]]] なんてのもあります。
([[名無しさん]] [WEAK[2006-07-02 03:19:04 +00:00]])

[44] [CODE(MIME)@en[[[application/x-dd+ext]]]] ってのもありますね。

[51] [CODE(MIME)@en[[[text/x-c++]]]], [CODE(MIME)@en[[[text/x-c++hdr]]]],
[CODE(MIME)@en[text/x-c++src]],
[CODE(MIME)@en[text/x-objective-c++]] などもあります。

[5] [CODE(MIME)@en[[[application/x-tar+gzip]]]] は[[圧縮形式]]を表しており、
厳密には構造化構文とはいえないかもしれません。

[24] [CODE(MIME)@en[application/rdf+xml+abbrev]],
[CODE(MIME)@en[application/json+ld]],
[CODE(MIME)@en[application/x-json+ld]]
なるものもあります。
[CODE[+]] が単なる語境界になってしまっています。

[25] [[CPHL]] は含まれる情報の種類を指定するためにいくつも [CODE[+]] と種別を本来の
[[MIME型]]の後に続けられるとしています。

[28] [[Pygments]] は [[JavaScript]] と [[PHP]] を [CODE(MIME)@en[text/javascript+php]]
といったように[[言語]]の組み合わせを表すために [CODE[+]] を使っています。

[REFS[
- [27] [CITE[Available lexers — Pygments]] ([TIME[2017-04-02 12:42:45 +09:00]]) <http://pygments.org/docs/lexers/>
]REFS]

[30] [CODE[text/x-h2h+html]] は [[HTML]] が混用されるモードを表していました。

[38] [[oEmbed]] は [CODE(MIME)@en[[[[VAR[*]]/[VAR[*]]+oembed]]]] 
を使っていますが、どちらかといえば [CODE[xml]] や [CODE[json]]
のように [VAR[*]] の部分の方が[[構造化構文]]に見えるものです。

[39] その他 [CODE[application/json+[VAR[*]]]] で [[JSON]]
の[[応用]]を表す場合があるようです。



[43] 
[CODE[text/javascript+protovis]]


* 歴史

** RFC 3023

[33]
[[RFC 3023]] の [CODE(MIME)@en[+xml]]
以来、 [[XML]] と [[XML応用]]のような関係を示すために、
[[媒体型]]の末尾に [CODE(MIME)@en[+[VAR@ja[書式名]]]]
のような[[文字列]]をつけるようになりました。

この[[接尾辞]]は、 [[RFC 3023]] で [CODE(MIME)@en[+xml]]
が定義されているのと、 [[RFC 4288]]
で (将来同様な規定が他の書式に対してもなされることに対して)
注意が促されている他は、明確に定義されているわけではありませんでした。

[52] [CITE@en[RFC 3023 - XML Media Types]]
( ([TIME[2014-07-11 12:46:44 +09:00]] 版))
<http://tools.ietf.org/html/rfc3023#appendix-A>

** RFC 6838 / RFC 6839

[49] [[RFC 6838]] で登録手続きが定義され、
[[RFC 6839]] で用法が明確化されて初期状態での接尾辞の定義・登録が行われました。

**

[41] 
[CITE@en[Media Types with Multiple Suffixes]], [TIME[2021-01-11T06:31:16.000Z]] <https://rhiaro.github.io/draft-w3cdidwg-media-types-with-multiple-suffixes/>

[42] [CITE@en[draft-w3cdidwg-media-types-with-multiple-suffixes-00 - Media Types with Multiple Suffixes]], [TIME[2021-01-09T17:32:34.000Z]], [TIME[2021-01-11T06:31:52.993Z]] <https://tools.ietf.org/html/draft-w3cdidwg-media-types-with-multiple-suffixes-00>



