/
565.txt
1760 lines (1383 loc) · 93.9 KB
/
565.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
[45] [DFN[[RUBYB[[[MIME型]]]@en[MIME type]]]]は、[[ファイル]]の種別を表す短い[[識別子]]です。
大分類と小分類を [CODE[text/plain]] のように[[斜線]]で区切って識別子とするのが特徴です。
[21] [[MIME]] ([[電子メール]]) の他、[[Web]] ([[HTTP]]/[[HTML]]) や [[SIP]]、
[[RTP]] など様々な[[応用]]でデータ形式の記述方式として広く採用されています。
;; [143] [[ファイルシステム]]における[[拡張子]]など[[ファイル]]の種類におおむね対応する概念です。
* 仕様書
[REFS[
- [221] '''[CITE@en[RFC 2046 - Multipurpose Internet Mail Extensions (MIME) Part Two: Media Types]] ([TIME[2015-03-22 13:14:46 +09:00]] 版) <http://tools.ietf.org/html/rfc2046>'''
-- [223] [CITE@en[RFC 2046 - Multipurpose Internet Mail Extensions (MIME) Part Two: Media Types]] ([TIME[2015-03-22 13:14:46 +09:00]] 版) <http://tools.ietf.org/html/rfc2046#section-1>
- [35] '''[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>'''
-- [166] [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-4.1>
-- [170] [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-4.2>
-- [191] [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-4.3>
-- [208] [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-5.5>
- [71] [CITE@en[RFC 7231 - Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content]] ([TIME[2014-06-07 01:55:45 +09:00]] 版) <https://tools.ietf.org/html/rfc7231#section-3.1.1.1>
- [84] [CITE@en[RFC 7231 - Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content]] ([TIME[2014-06-07 01:55:45 +09:00]] 版) <https://tools.ietf.org/html/rfc7231#section-5.3.2>
- [131] [CITE[Media Types]] ([TIME[2015-04-16 05:20:38 +09:00]] 版) <https://www.iana.org/assignments/media-types/media-types.xhtml>
- [289] [CITE[MIME Sniffing Standard]] ([TIME[2016-03-05 01:29:10 +09:00]] 版) <https://mimesniff.spec.whatwg.org/#understanding-mime-types>
]REFS]
[222] [[MIME型]]は、 [[MIME]] 仕様群の1つである [DFN[[[RFC 2046]]]]
で規定されています。しかし、その適用範囲の拡大に追随した仕様の改訂が行われず、
他のいろいろな仕様書が自身に必要な範囲でそれぞれ規定する形で事実上の改訂を
(相互に矛盾するようなしないようなよくわからない状態で) 行っています。
* 呼称
[144] [[MIME型]]は、他に次のような名前で呼ばれています。
[FIG(short list)[
- [DFN[[RUBY[媒体型][メディアタイプ]@en[media type]]]]
- [DFN[[RUBYB[インターネット媒体型]@en[Internet Media Type]]]]
- [DFN[[[MIME]] [RUBY[媒体型][メディアタイプ]@en[media type]]]]
- [DFN[[RUBYB[[[内容型]]]@en[content type]]]]
]FIG]
[145] [[MIME型]]は大分類と小分類の組で表されますが、この大分類も「[RUBYB[型]@en[type]]」、
全体も「型」と呼ばれるため、どちらを指しているのか曖昧なことも少なくありません。
[146] 「[[MIME型]]」などと修飾される場合は全体を指していることが多く、
「型」とのみ呼ばれる時は大分類を指していることが多いようですが、例外もあります。
大分類であることを明示する時は、「[DFN[[RUBYB[最上位型]@en[top-level type]]]]」
のように[RUBYB[最上位]@en[top-level]]と修飾するのが一般的です。
;; [238] [[RFC 2077]] は[[最上位型]]を [DFN[[[primary content type]]]] や
[DFN[[[primary type]]]] と呼んでいます。
[EG[
[147] ほとんどの場合「[[MIME型]]」や「[[内容型]]」と言えば [CODE(MIME)@en[text/plain]]
全体を指しますが、稀に [CODE(MIME)@en[text]] のみを指していることがあります。
]EG]
[148] [[HTML Standard]] や [[Fetch Standard]] などの現在の [[Web]]
の仕様書は、最も普及した用語である「[[MIME型]]」を採用しています。
[[MIME Sniffing Standard]] は「[[MIME型]]」などの用語を定義しています。
[HISTORY[
[149] [[IETF]] は「[[媒体型]]」を正式な用語と考えているようで、
近年の [[RFC]] の多くはこの語を採用しています。しかし次に示す通り歴史的には相当な混乱があり、
現在でも完全に統一されているわけではないようです。
[104] [[RFC 1341]]/[[RFC 1521]] は「[CODE(MIME)@en[Content-Type]] の値」といったような表現を使っており、現在の「[[MIME型]]」に相当する特別な用語は用意していなかったようです。
「content-type/subtype pair」という表現もあります。また登録雛形では
「MIME type name」/「MIME subtype name」となっています [SRC[>>102, >>105]]。
重要な概念に明確な用語を定義しなかったことが、以後の混乱の引き金となってしまいました。
[108] [[RFC 1341]]/[[RFC 1521]] は各1箇所だけ「[RUBYB[媒体型]@en[media type]]」
という語を使っています [SRC[>>106, >>107]]。
[113] [[RFC 1590]] には従来の「MIME [RUBYB[型]@en[Type]]」を「[RUBYB[媒体型]@en[''M''edia ''T''ype]]」
と呼ぶ [SRC[>>111]] との記述があります。しかし
「Content-type/subtype pair」という表現も残っています。また
「Media type name」/「Media subtype name」という記述もあります。
[117] [[RFC 2048]] は「[RUBYB[[[媒体型]]]@en[''m''edia ''t''ype]]」
[SRC[>>114]] と表現しています。1箇所だけ「MIME type and subtype」
との記述もあります。「MIME media type」という表現や、
「MIME media type name」/「MIME subtype name」という表現も数箇所だけ登場します。
[124] [[RFC 4288]] や [[RFC 6838]] は「[RUBYB[[[媒体型]]]@en[''m''edia ''t''ype]]」[SRC[>>121]]
に統一しています。
[133] [[IANA登録簿]]の題名は当初は「MIME Media Types」[SRC[>>132]] でした。
「Content Types」/「Content Subtypes」という表現もありました。
[134] 現在の[[IANA登録簿]]の題名は「Media Types」[SRC[>>131]] となっています。
「Media Types (formerly known as MIME types) and Media Subtypes」
という記述もあります。
[135] 多くの [[RFC]] は「Internet Media Type」とも呼んでいます。
古いものでは [[RFC 1866]] がこの語を使っています [SRC[>>137]] (どの [[RFC]]が最古のものかは不明)。
[[RFC 3420]] では題名にもなっています [SRC[>>136]] (が本文中では
「MIME 媒体型」と呼ばれています)。
;; [139] 「"MIME types" (renamed "Internet Media Types" in later specs [RFC2046])」
と述べた文書 [SRC[>>138]] もありますが、 [[RFC 2046]] には
「Internet Media Type」は登場していません。
[141] [[HTML4]] は「[RUBYB[[[内容型]]]@en[content type]]」と呼んでいました。
理由として、当時の用法により沿っている点、[[CSS]] の[[媒体型]]と区別できる点を挙げています
[SRC[>>140]]。しかしその説明と同じ章で「MIME 型」という語も使われています [SRC[>>140]]。
;; [142] この当時から「[[MIME型]]」が最も一般的な用語だったように思います。
[REFS[
- [137] [CITE@en[RFC 1866 - The 'text/html' Media Type]] ([TIME[2015-04-06 15:12:54 +09:00]] 版) <https://tools.ietf.org/html/rfc1866>
- [136] [CITE@en[RFC 3420 - Internet Media Type message/sipfrag]] ([TIME[2015-04-05 20:24:31 +09:00]] 版) <https://tools.ietf.org/html/rfc3420>
- [138] [CITE@en[draft-masinter-mime-web-info-02 - MIME and the Web]] ([TIME[2015-01-18 18:04:50 +09:00]] 版) <https://tools.ietf.org/html/draft-masinter-mime-web-info-02>
- [140] [CITE@en[Basic HTML data types]] ([TIME[1999-12-25 08:25:40 +09:00]] 版) <http://www.w3.org/TR/html4/types.html#h-6.7>
]REFS]
]HISTORY]
* 意味
[290] [[資源]]の[DFN[[F[[RUBYB[[[MIME型]]]@en[MIME type]]]]]]は、
当該[[資源]]の用法や書式についての技術的[[ヒント]]です [SRC[>>289]]。
[261] [[MIME型]]は、その適用対象の解釈の方法 ([[意味]])
を表すものです。具体的には利用される場面によりますが、
多くの場合は適用対象となる[[バイト列]]や[[文字列]]の[[メタデータ]]として[[MIME型]]を指定することで、
その[[バイト列]]や[[文字列]]の意味と解釈方法を指定することになります。
[EG[
[262] [[MIME]] では、 [CODE(MIME)@en[[[Content-Type:]]]] [[ヘッダー]]の値として指定すると、
[[メッセージ]]の[[本体]]の[[バイト列]]の形式を表すものとみなされます。
]EG]
[EG[
[263] [[HTML]] の [CODE(HTMLe)@en[[[style]]]] [[要素]]では、
[CODE(HTMLa)@en[[[style]]]] [[属性]]の値として指定すると、
[[内容]]の[[文字列]]の[[スタイル言語]]を表すものとみなされます。
]EG]
[EG[
[264] [[HTTP要求]]の [CODE(HTTP)@en[[[Accept:]]]] [[ヘッダー]]の値として指定すると、
それに対する[[HTTP応答]]で使うべき [[MIME型]]を指定するものとみなされます。
([[HTTP要求]]自体にその[[MIME型]]で解釈されるべきデータが含まれるわけではありません。)
]EG]
[155] ファイル形式と [[MIME型]]は、一対一対応関係にはありません。
同じ形式に複数の[[MIME型]]を割り当てるのは[RUBYB[非推奨]@en[discouraged]]です
[SRC[>>170]] が、実際には数多くあります。
[EG[
[156] [[XML]] の [[MIME型]]には [CODE(MIME)@en[[[text/xml]]]] や
[CODE(MIME)@en[[[application/xml]]]] があります。
[[XHTML]] の [[MIME型]]には [CODE(MIME)@en[[[application/xhtml+xml]]]] や
[CODE(MIME)@en[[[application/xml]]]] があります。
]EG]
[182] [[IANA登録簿]]は[RUBYB[好ましい]@en[prefer]]ものを1つ選び、
それ以外を「deprecated alias」とすることを求めています [SRC[>>170]]。
その場合[[応用]]は好ましいものを使わなければ[['''なりません''']] [SRC[>>170]]。
しかし必ずしも現実に沿った運用がなされているとはいえません。
[EG[
[259] 世間で最も広く用いられている [[JavaScript]] の [[MIME型]]は
[CODE(MIME)@en[[[text/javascript]]]] ですが、 [[IANA登録簿]]と [[RFC]]
では「[[廃止]]」状態になっています。
]EG]
[184] 世間で用いられる [[MIME型]]は、その本来の意味を逸脱しているものも少なくありません。
[EG[
[186] 例えば [[HTTP]] で[[ダウンロード]]させたい時に
[CODE(MIME)@en[[[application/octet-stream]]]] や
[CODE(MIME)@en[[[application/download]]]] が用いられることがあります。
つまりファイル形式ではなく、求める処理を表すために [[MIME型]]が使われています。
]EG]
[EG[
[185] 例えば [[Web API]] の [CODE(HTTP)@en[[[Accept:]]]] [[ヘッダー]]では、
返されるデータの標準的な [[MIME型]]を使わずに、 [[API]]
の「[[バージョン]]」番号などを含めた特別な[[MIME型]]を指定させたりシます。
つまりファイル形式ではなく、 [[API]] の動作モードの指定のために[[MIME型]]が使われています。
]EG]
[EG[
[256] [[プラグイン]]の種類を表すために[[MIME型]]が使われることがあります。
標準的な [[MIME型]]があるのに[[プラグイン]]を表す特別な [[MIME型]]が用いられたり、
データを入力としない[[プラグイン]]の実行のために特別な [[MIME型]]が用いられたりします。
つまりファイル形式ではなく、[[プラグイン]]を識別するために[[MIME型]]が使われています。
]EG]
[260] [[MIME型]]は元々 [[MIME]] による[[情報交換]]のために規定されたものですが、
[[OS]] と[[アプリケーション]]のような同一環境上での伝達 (他者との通信ではない、
狭義の[[情報交換]]) で使われたり、特定[[アプリケーション]]内部でのみ使われたりすることもよくあります。
その場合、特定[[アプリケーション]]でしか意味を成さない[[内部データ構造]]などに
[[MIME型]]が割り当てられることもありますし、標準的な
[[MIME型]]であっても、本来のその定義による[[バイト列]]等ではなく、
それに相当する[[内部データ構造]]を表していることもあります。
* データモデル
[291] [[MIME型]]は、普通、[[文字列]]または[[バイト列]]と考えられています。
[292] [DFN[[RUBYB[構文解析可能MIME型]@en[parsable MIME type]]]]は、
[[MIME型の構文解析]]が [[null]] を返さないような [[MIME型]]です [SRC[>>289]]。
[293] [[構文解析可能MIME型]]には、対応する[DFN[[RUBYB[構文解析済みMIME型]@en[parsed MIME type]]]]があります
[SRC[>>289]]。これは[[MIME型の構文解析]]で得られる値です。
[150] [[構文解析済みMIME型]]は、次のもので構成されます。
[FIG(short list)[
- [F[型][最上位型]]
- [F[部分型]]
- [F[[[引数]]の[[辞書]]]]
]FIG]
[151] [DFN[[RUBYB[型]@en[type]]]] ([DFN[[RUBYB[[[最上位型]]]@en[top-level type]]]]) は、元々は[[媒体]]の種類を区別することを意図していたようで
(「[[媒体型]]」の語源)、 [CODE[[[text]]]]、[CODE[[[audio]]]]、[CODE[[[video]]]]
などがあります。しかし [CODE[[[text]]]] の意味するところが曖昧だったり、
ほとんどが [CODE[[[application]]]] に分類されていたりして、
あまりうまく機能していません。
[152] [DFN[[RUBYB[部分型][subtype]]]]は、[[型]]内における細かな分類であり、
実際のファイル形式の相当するものです。 [CODE[[[text/plain]]]] の [CODE[plain]]、
[CODE[[[image/png]]]] の [CODE[png]]、[CODE[[[application/pdf]]]] の [CODE[pdf]]
などがあります。
[153] [[型]]と[[部分型]]は、組として1つの [[MIME型]]を構成します。
異なる[[型]]と[[部分型]]を組み合わせることはできません。例えば
[CODE[[[image/png]]]] の [CODE[image]] を [CODE[video]] に置き換えるような使い方はできず、
まったく異なる [[MIME型]]となります。
;; [154] [CODE[[[video/ogg]]]] と [CODE[[[audio/ogg]]]] のように異なる[[型]]で同じ[[部分型]]の
[[MIME型]]が定義されていることはありますが、すべての[[型]]に対して定義されているわけではありません。
また、[[部分型]]が同じだからといって異なる[[型]]の [[MIME型]]が同じファイル形式を表しているとは限りません。
[157] [[MIME型]]には、零個以上の[[引数]]を指定することができます。
[[MIME型]]という用語が[[引数]]を含んでいるかどうかは、文脈により異なります。
明確に定義されていないことも少なくありません。
近代的な [[Web]] 技術の[[仕様書]]では、原則として[[引数]]を含んでいます。
;; [159] [[MIME型]]によっては[[引数]]を必須と規定していることもありますが、
[[引数]]を指定できない文脈や、指定されていると正しく処理できない実装も少なくありません。
[294] [[構文解析可能MIME型]]の[DFN[[RUBYB[MIME型部分]@en[MIME type portion]]]]は、
[[構文解析済みMIME型]]の[F[型][最上位型]]と[F[部分型]]を使い、
[[引数]]なしで[[MIME型の直列化]]を行った結果です。 [SRC[>>289]]
[295] [DFN[[RUBYB[直列化済みMIME型]@en[serialized MIME type]]]]は、
[[構文解析済みMIME型]]に[[MIME型の直列化]]を適用した結果です。 [SRC[>>289]]
* MIME 型の一覧
[161] [[MIME型]]は、標準仕様で規定されているものもそうでないものも、
よく使われているものもそうでないものも含め、実に数多く、様々なものが存在しています。
[162] 次の表で [CODE[[[*]]]] は、複数の [[MIME型]]のパターンを表しています。
所属する [[MIME型]]は、リンク先の各ページを参照してください。
ただし、場合によっては複数の [[MIME型]]を表すため、あるいは設定ミスその他の理由でしばしば
[[MIME型]]として使われるものもいくつかあります。
[FIG(list)[
[FIGCAPTION[
[26] [[MIME型]]の一覧
]FIGCAPTION]
,[CODE(MIME)@en[[[/]]]]
,[CODE(MIME)@en[[[*/*]]]]
,[CODE(MIME)@en[[[vnd.android.cursor.dir/[VAR[*]]]]]]
,[CODE(MIME)@en[[[vnd.android.cursor.item/[VAR[*]]]]]]
,[CODE(MIME)@en[[[app/gg]]]],[[Google Desktop]] [[gadget]]
,[CODE(MIME)@en[[[application/[VAR[*]]]]]]
,[CODE(MIME)@en[[[x-application/[VAR[*]]]]]]
,[CODE(MIME)@en[[[zz-application/zz-winassoc-tgz]]]]
,[CODE(MIME)@en[[[archive/[VAR[*]]]]]]
,[CODE(MIME)@en[[[attachment/file]]]]
,[CODE(MIME)@en[[[audio/[VAR[*]]]]]]
,[CODE(MIME)@en[[[audio-file]]]]
,[[auth/sicily]] ,[[FrontPage]]
,[CODE(MIME)@en[[[avro/binary]]]]
,[CODE(MIME)@en[[[b64_zlib_yaml]]]]
,[CODE(MIME)@en[[[x-be2]]]]
,[CODE(MIME)@en[[[bin/application]]]]
,[CODE(MIME)@en[[[binary]]]]
,[CODE(MIME)@en[[[binary/octet-stream]]]]
,[CODE(MIME)@en[[[chemical/[VAR[*]]]]]]
,[CODE(MIME)@en[[[coloreal/embedded]]]]
,[[x-conference/x-cooltalk]] ,[[CoolTalk]] [Netscape]
,[CODE(MIME)@en[[[content/unknown]]]]
,[CODE(MIME)@en[[[x-data/xact-error]]]]
,[CODE(MIME)@en[[[unknown]]]]
,[CODE(MIME)@en[[[database/x-unknown]]]]
,[CODE(MIME)@en[[[default]]]]
,[CODE(MIME)@en[[[defiant/xsl-template]]]]
,[[x-device/floppy]] ,[GNOME]
,[CODE(MIME)[[[x-directory/normal]]]]
,[CODE(MIME)@en[[[document/x-epub]]]]
,[CODE(MIME)@en[[[drawing/x-dwf]]]]
,[CODE(MIME)@en[[[drawing/x-dwf(old)]]]]
,[CODE(MIME)@en[[[drawing/x-dwf (old)]]]]
,[CODE(MIME)@en[[[dsmcc-[VAR[*]]/[VAR[*]]]]]]
,[CODE(MIME)@en[[[dsmcc-download/jpeg]]]]
,[CODE(MIME)@en[[[dsmcc-file/mpeg2-ps]]]]
,[CODE(MIME)@en[[[dsmcc-file/html]]]]
,[CODE(MIME)@en[[[dsmcc-stream/mpeg2-ts]]]]
,[CODE(MIME)@en[[[dvi]]]],[[RFC 1049]]
,[CODE(MIME)@en[[[x-epoc/x-sisx-app]]]]
,[CODE(MIME)@en[[[example/[VAR[*]]]]]]
,[[x-ferrum-head/*]]
,[[x-ferrum-menu/*]]
,[CODE(MIME)@en[[[font/[VAR[*]]]]]]
,[CODE(MIME)@en[[[x-font/[VAR[*]]]]]]
,[CODE(MIME)@en[[[x-form/x-openscape]]]]
,[CODE(MIME)@en[[[gadget/x-googlegadget]]]]
,[CODE(MIME)@en[[[vnd.google.fitness.session/biking]]]]
,[CODE(MIME)@en[[[vnd.google.fitness.session/running]]]]
,[CODE(MIME)@en[[[vnd.google.fitness.data_type/[VAR[*]]]]]]
,[CODE(MIME)@en[[[com.google.android.gms.fitness.data_type/[VAR[*]]]]]]
,[CODE(MIME)@en[[[vnd.google.fitness.activity_type/running]]]]
,[CODE(MIME)@en[[[vnd.google.android.hangouts/vnd.google.android.hangout_privileged]]]]
,[CODE(MIME)@en[[[vnd.google.android.hangouts/vnd.google.android.hangout_whitelist]]]]
,[CODE(MIME)[[[graphics/x-inventor]]]] ,Open Inventor 3次元 scenes
,[CODE(MIME)@en[[[gzip/document]]]]
,[CODE(MIME)@en[[[image/[VAR[*]]]]]]
,[CODE(MIME)@en[[[in/share]]]]
,[CODE(MIME)@en[[[inode/[VAR[*]]]]]] ,[freedesktop.org]
,[CODE(MIME)@en[[[interface/x-winamp-skin]]]]
,[CODE(MIME)@en[[[x-jigsaw/config]]]]
,[CODE(MIME)@en[[[x-kom/basic]]]]
,[CODE(MIME)@en[[[x-lml/x-lml]]]]
,[CODE(MIME)@en[[[math/[VAR[*]]]]]]
,[CODE(MIME)@en[[[matter-transport/sentient-life-form]]]]
,[CODE(MIME)@en[[[mail-file]]]]
,[CODE(MIME)@en[[[mce-text/javascript]]]]
,[CODE(MIME)@en[[[message/[VAR[*]]]]]]
,[CODE(MIME)@en[[[mforge/x-mirage]]]]
,[CODE(MIME)@en[[[midi/mid]]]]
,[CODE(MIME)@en[[[misc/ultravox]]]]
,[CODE(MIME)@en[[[model/[VAR[*]]]]]]
,[CODE(MIME)@en[[[x-model/x-mesh]]]]
,[CODE(MIME)@en[[[more/less]]]]
,[CODE(MIME)@en[[[mozilla.application/cached-xul]]]]
,[CODE(MIME)@en[[[multipart/[VAR[*]]]]]]
,[CODE(MIME)@en[[[x-wap.multipart/vnd.uplanet.header-set]]]]
,[CODE(MIME)@en[[[x-music/x-midi]]]]
,[CODE(MIME)@en[[[none]]]]
,[CODE(MIME)@en[[[octet/stream]]]]
,[CODE(MIME)@en[[[plain/text]]]]
,[CODE(MIME)@en[[[plugin/[VAR[*]]]]]]
,[CODE(MIME)@en[[[x-pmaildx/x-mmctrl]]]]
,[CODE(MIME)@en[[[x-postpet/[VAR[*]]]]]]
,[CODE(MIME)@en[[[postscript]]]],[[RFC 1049]]
,[CODE(MIME)@en[[[postscript-file]]]]
,[CODE(MIME)@en[[[pson]]]]
,[CODE(MIME)@en[[[raw]]]]
,[CODE(MIME)@en[[[s]]]]
,[CODE(MIME)@en[[[x-scheme-handler/[VAR[*]]]]]]
,[CODE(MIME)@en[[[scribe]]]],[[RFC 1049]]
,[CODE(MIME)[[[x-script/x-wfxscript]]]]
,[CODE(MIME)@en[[[sgml]]]],[[RFC 1049]]
,[CODE(MIME)@en[[[x-shader/x-fragment]]]]
,[CODE(MIME)@en[[[x-shader/x-vertex]]]]
,[CODE(MIME)[[[x-squid-internal/vary]]]]
,[CODE(MIME)@en[[[x-sun-attachment]]]]
,[CODE(MIME)@en[[[sun-deskset-message]]]]
,[CODE(MIME)[[[x-system/x-error]]]] ,[Namazu]
,[CODE(MIME)@en[[[tex]]]],[[RFC 1049]]
,[CODE(MIME)@en[[[text/[VAR[*]]]]]]
,[CODE(MIME)@en[[[x-text-pc/ms-word]]]]
,[CODE(MIME)@en[[[troff]]]],[[RFC 1049]]
,[CODE(MIME)@en[[[unknown/unknown]]]]
,[CODE(MIME)@en[[[x-unknown/octet-stream]]]]
,[CODE(MIME)@en[[[x-unknown/x-unknown]]]]
,[CODE(MIME)@en[[[vector/[VAR[*]]]]]]
,[CODE(MIME)@en[[[video/[VAR[*]]]]]]
,[CODE(MIME)@en[[[videotex/vemmi]]]]
,[CODE(MIME)@en[[[x-visa-ii/x-auth]]]]
,[CODE(MIME)@en[[[windows/*]]]]
,[CODE(MIME)@en[[[workbook/formulaone]]]]
,[CODE(MIME)@en[[[i-world/i-vrml]]]]
,[CODE(MIME)@en[[[x-world/[VAR[*]]]]]]
,[CODE(MIME)@en[[[www/mime]]]] ,[[libwww]]
,[CODE(MIME)@en[[[www/unknown]]]] ,未知 (自動判別) [SRC[[[libwww]]]]
,[CODE(MIME)@en[[[www/source]]]]
,[CODE(MIME)@en[[[x-[VAR[*]]]]]],[[RFC 1049]]
,[CODE(MIME)@en[[[xgi/[VAR[*]]]]]]
,[CODE(MIME)@en[[[xml/user-profile]]]],[[XUP]]
,[CODE(MIME)@en[[[yaml]]]]
]FIG]
[9] [[JSON]]形式の一覧データファイルが >>10 にあります。
[REFS[
- [10] [CITE@en[data-web-defs/mime-types.txt at master · manakai/data-web-defs]] ([TIME[2015-01-30 12:44:11 +09:00]] 版) <https://github.com/manakai/data-web-defs/blob/master/doc/mime-types.txt>
]REFS]
* 構文
[158] [[MIME型]]の構文 (本体、[[引数]]とも) は統一された規定が存在せず、
[[プロトコル]]や[[マーク付け言語]]などがそれぞれの規定を行っています。
それらは微妙に異なっていることがよくあります。また、明確な規定を欠いていることも少なくありません。
[171] [[RFC 6838]] は [[IANA登録簿]]に登録される [[MIME型]]の[[型]]と[[部分型]]、
[[引数]]名の構文を規定しています。
;; [172] しかしそれらの組み合わせ方 (区切り文字など)、登録されない
[[MIME型]]の構文には言及していません。
[72] [[HTTP]] は [[RFC 2046]] を引用しつつ、独自に [[MIME型]]の構文を定義しています [SRC[>>71]]。
[73] [[MIME型]]は、[[型]]、[CODE[[[/]]]]、[[部分型]]、零個以上の[[引数]]で構成されます。
ただし[[引数]]の前には、 [CODE[[[;]]]] が必要で、 [CODE[[[;]]]]
の前後には [[OWS]] を挿入できます。 [SRC[>>71]]
[74] [[型]]と[[部分型]]は、 [[HTTP]] では[[字句]]です [SRC[>>71]]。
[[IANA登録簿]]では、[[制限名]]です [SRC[>>170]]。
[[IANA登録簿]]では64文字[[以下]]である[['''べきです''']] [SRC[>>170]]。
[173] [[型]]と[[部分型]]は、[[大文字・小文字不区別]]です [SRC[>>71, >>170]]。
[FIG(railroad)[
= [[型]]
= [CODE[[[/]]]]
= [[部分型]]
= *
== [[OWS]]
== [CODE[[[;]]]]
== [[OWS]]
== [[引数]]
]FIG]
[75] [[引数]]は、名前、[CODE[[[=]]]]、値で構成されます [SRC[>>71]]。
[77] [[引数]]の名前は、 [[HTTP]] では[[字句]]です [SRC[>>71]]。
[[IANA登録簿]]では、[[制限名]]です [SRC[>>191]]。
[174] [[引数]]の名前は、[[大文字・小文字不区別]]です [SRC[>>71, >>191]]。
[78] 値は[[字句]]または[[引用文字列]]です。
[[引用符]]の有無は、意味を持ちません。
値の大文字と小文字が区別されるかは、[[引数]]によります。 [SRC[>>71]]
[FIG(railroad)[
= [[引数]]名
= [CODE[[[=]]]]
= |
== [[字句]]
== [[引用文字列]]
]FIG]
;; [80] [CODE[[[=]]]] の前後には [[BWS]] も認められていません [SRC[>>71]]。
;; [234] [[引数 (MIME)]] や[[引数 (HTTP)]] も参照。
[198] [[引数]]の順序には意味がありません [SRC[>>191, >>223]]。
同じ[[引数]]が複数あるのは[RUBYB[[[誤り]]]@en[error]]です [SRC[>>191]]。
;; [199] 誤りをどう処理するべきなのかは不明です。
[76] [[引数]]の有無は、[[MIME型]]の定義によっては処理に影響があるかもしれません [SRC[>>71]]。
[175] [DFN[[RUBYB[[[制限名]]]@en[restricted-name]]]]は、
[[ASCII英数字]]、 [CODE[[[!]]]], [CODE[#]], [CODE[[[$]]]],
[CODE[[[&]]]], [CODE[[[-]]]], [CODE[[[^]]]], [CODE[[[_]]]],
[CODE[[[.]]]], [CODE[[[+]]]] で構成される1文字[[以上]]126文字[[以下]]の文字列です
[SRC[>>170]]。
;; [176] このうち [CODE[[[.]]]] の初出は[[木]]、[CODE[[[+]]]] は[[構造化構文接尾辞]]を表すことになっています [SRC[>>170]]。
[[部分型]]はそれでよいとして、 [[型]]や[[引数]]名についてこれをどう解釈するべきかは不明瞭です。
また未登録の [[MIME型]]はこれらの規則に従っていないものもあります。
;; [183] [CODE[[[!]]]], [CODE[#]], [CODE[[[$]]]],
[CODE[[[&]]]], [CODE[[[^]]]] を使った [[MIME型]]が実在するのかは不明です。
** 構文解析
[296] [DFN[[RUBYB[MIME型の構文解析]@en[parse a MIME type]]]]は、
次のようにしなければ[MUST[なりません]] [SRC[>>289]]。
[FIG(steps)[
= [297] [VAR[バイト列]]を、入力の[[バイト列]]に設定します。
= [298] [VAR[バイト列]]が[[空バイト列]]なら、 [[null]] を返してここで停止します。
= [299] [VAR[バイト列]]の先頭に[[空白バイト]]があれば、すべて除去します。
= [300] [VAR[型]]を、[VAR[バイト列]]の先頭の [CODE[0x2F]]
以外の[[バイト列]]に設定し、それを[VAR[バイト列]]から除去します。
= [301] [VAR[型]]が[[空バイト列]]か、[VAR[型]]が[[ASCIIバイト]]以外を含むなら、
ここで停止します。
= [302] [VAR[型]]を、[VAR[型]]を[[ASCII小文字に変換]]したものに設定します。
= [303] [VAR[部分型]]を、[VAR[バイト列]]の先頭の[[空白バイト]]以外かつ
[CODE[0x3B]] 以外の[[バイト列]]に設定し、それを[VAR[バイト列]]から除去します。
= [304] [VAR[部分型]]が[[空バイト列]]なら、ここで停止します。
= [305] [VAR[部分型]]を、[VAR[部分型]]か、[VAR[型]]が[[ASCIIバイト]]以外を含むなら、
[[ASCII小文字に変換]]したものに設定します。
=
@@
]FIG]
* 最上位型
[224] [CODE[[[/]]]] より前の部分が[RUBYB[型]@en[type]] ([RUBYB[最上位型]@en[top-level type]]) です。
[225] 一般に[[最上位型]]はデータの[RUBYB[一般]@en[general]]の型を表し、
[[部分型]]がその型の特定の形式を表します [SRC[>>223]]。
[EG[
[226] 例えば [CODE(MIME)@en[[[image/png]]]] は、[[画像]]であり、
その具体的な書式は [[PNG]] であることを表しています。
[[利用者エージェント]]がこの [[MIME型]]について知識が無いとしても、
[[画像]]であることはわかります。
]EG]
[227] [[最上位型]]の情報は、未知の[[部分型]]の場合に生データを[[利用者]]に提示するべきかどうかを決定するために使うことができます [SRC[>>223]]。
[EG[
[228] [CODE(MIME)@en[[[text/*]]]] なら未知でも生データを提示して構わないかもしれませんが、
[CODE(MIME)@en[[[image/*]]]] なら好ましくなさそうえす [SRC[>>223]]。
]EG]
[229] [[最上位型]]はこのようなものですから、
[CODE(MIME)@en[[[text/*]]]]、[CODE(MIME)@en[[[image/*]]]]、
[CODE(MIME)@en[[[audio/*]]]]、[CODE(MIME)@en[[[video/*]]]]
の各[[部分型]]は、実際には異なる種類の情報を埋め込むべきではありません [SRC[>>223]]。
;; [230] そのような場合は [CODE(MIME)@en[[[multipart/*]]]] や
[CODE(MIME)@en[[[application/*]]]] を使うべきです [SRC[>>223]]。
;; [231] [CODE(MIME)@en[[[video/*]]]] が[[音声トラック]]や[[テキストトラック]]を含むのは例外とされています。
([CODE(MIME)@en[[[video/*]]]] 参照。)
[177] [[部分型]]の決定には[[型]]の意味を考慮しなければ[['''ならず''']]、
[[部分型]]は[[型]]の制約に適合しなければ[['''なりません''']] [SRC[>>170]]。
[EG[
[178] 例えば [CODE(MIME)@en[[[multipart/[VAR[*]]]]]] に属する[[部分型]]は
[CODE(MIME)@en[[[multipart/[VAR[*]]]]]] の共通の構文に従う必要があります。
]EG]
* 木と [CODE[x-]]
[28] [[部分型]]は [CODE[[[.]]]] を区切り文字とする階層構造によって分けられています。
これは[DFN[[RUBYB[[[木]]]@en[tree]]]]と呼ばれています。
[EG[
[164] [CODE(MIME)@en[[[image/png]]]] は[[標準木]]に、
[CODE(MIME)@en[[[image/vnd.microsoft.icon]]]] は[[事業者木]]に属しています。
]EG]
;; [[木 (IETF)]]を参照。
[165] また [CODE[[[x-]]]] ではじまる[[部分型]]は、かつては[[私用]]のために予約されていました。
現在は特別な扱いはされておらず、 [CODE[[[x-]]]] から始まる[[部分型]]も
[[IANA登録簿]]に登録されています。
;; [[木 (IETF)]]をも参照。
[258] [[IANA登録簿]]には (不思議なことに) [CODE(MIME)@en[[[application/index]]]] のように[[木]]が
[[MIME型]]として登録されていることもあります。
* 構造化構文接尾辞
[68] [CODE(MIME)@en[[[image/svg+xml]]]] の [CODE(MIME)@en[[[+xml]]]] のように、
[[MIME型]]の末尾に [CODE[+]] と構文名がついているものは、その構文の一応用であることを表します。
この例では、 [[XML]] という構文に基づいた[[マーク付け言語]]の一種である [[SVG]]
ということを表しています。このようなものを[RUBYB[[[構造化構文接尾辞]]]@en[structured syntax suffix]]といいます。
詳しくはそちらの項を参照してください。
* 引数
[192] [[MIME型]]には、0個[[以上]]の[[引数]]を指定できます [SRC[>>191, >>223]]。
;; [193] しかし[[MIME型]]を使う文脈によっては、[[引数]]を指定できないこともあります。
[67] [[引数]]は、個別の[[MIME型]]で規定されているものもあれば、
[[最上位型]]に属する[[MIME型]]全体で規定されるものもあります [SRC[>>191, >>223]]。
複数の [[MIME型]]で定義を共有しているものもあります。
すべての[[MIME型]]で共通して利用できる[[引数]]は、正式には存在しませんが、
現実には幾つかの[[引数]]が [[MIME型]]と独立に使われています。
;; [194] 本来の [[MIME]] の設計思想に従うなら、すべての [[MIME型]]に適用可能な[[引数]]は他の[[ヘッダー]]で記述するべきです。
[233] 実装は、認識できない[[引数]]を無視しなければなりません [SRC[>>223]]。
[195] 全部または多数の [[MIME型]]で使われる[[引数]]には、次のものがあります。
[FIG(list short)[
- [CODE(MIME)@en[[[base64]]]]
- [CODE(MIME)@en[[[boundary]]]]
- [CODE(MIME)@en[[[capture]]]]
- [CODE(MIME)@en[[[charset]]]]
- [CODE(MIME)@en[[[charset-edition]]]]
- [CODE(MIME)@en[[[charset-extension]]]]
- [CODE(MIME)@en[[[codecs]]]]
- [CODE(MIME)@en[[[maxptime]]]]
- [CODE(MIME)@en[[[name]]]]
- [CODE(MIME)@en[[[odata[VAR[*]]]]]]
- [CODE(MIME)@en[[[profile]]]]
- [CODE(MIME)@en[[[ptime]]]]
- [CODE(MIME)@en[[[q]]]]
- [CODE(MIME)@en[[[qs]]]]
- [CODE(MIME)@en[[[rate]]]]
- [CODE(MIME)@en[[[version]]]]
]FIG]
[85] [[引数名]]「[CODE(HTTP)@en[[[q]]]]」は[RUBYB[非推奨]@en[discouraged]]です [SRC[>>84]]。
本来は [CODE(HTTP)@en[[[Accept:]]]] [[ヘッダー]]など一部の場面で使われるもので、
[[MIME型]]ではなく[[ヘッダー]]側に属する構文です。
[2] [[OData]] は [[OData]] の実装に対して [CODE(MIME)@en[[[odata]]]]
から始まる ([[OData]] で規定されていない) [[引数]]の利用を禁止しています [SRC[>>1]]。
[197] [[標準木]]に登録する [[MIME型]]は、[[引数]]の名前と値と意味を完全に規定しなければ[['''なりません''']]。
[CODE[[[vnd.]]]] や [CODE[[[prs.]]]] の[[木]]に登録する [[MIME型]]は、
可能な限り規定する[['''べき''']]です。 [SRC[>>191]]
;; [202] なぜ[[木]]によって要求度が異なるのか謎です。 [CODE[[[vnd.]]]] や
[CODE[[[prs.]]]] の登録の敷居を下げるためかもしれませんが、
[[相互運用性]]に支障が出るのでは...
[288] 実際にはそれを放棄しているものもあります。
[EG[
[276] 例えば [CODE(MIME)@en[[[text/markdown]]]] は、
任意の[[引数]]を使えると規定しています。
]EG]
[200] [[引数]]の値の構文は、[[引数]]によります。[[MIME型]]を登録する際は規定しなければ[['''なりません''']] [SRC[>>191]]。
;; [201] プロトコルによっては[[バイナリー]]を値として指定できるかもしれませんが、
他のプロトコルでは使えないので、避けたほうが無難です [SRC[>>191]]。
[275] [[引数]]の値として認められる範囲やそもそも[[引数]]を指定できるかどうかは、
他の[[引数]]の値に依存して決まることもあります。
[203] [[標準木]]の [[MIME型]]に対して新機能を追加する方法として新しい[[引数]]を定義する[['''べきではありません''']]。
既存の機能を変更せずに追加情報を与える新しい[[引数]]を定義するのは構いません。
[CODE[[[vnd.]]]] や [CODE[[[prs.]]]] の[[木]]においても同様とする[RUBYB[べき]@en[encourage]]ですが、必須ではありません。
[SRC[>>191]]
[EG[
[204] 例えば [[JPEG]] の改訂水準を表す [CODE[revision]] [[引数]]が挙げられます [SRC[>>191]]。
]EG]
;; [205] この規定の意図するところはあまりよくわかりません。
処理に影響を与えないなら、[[引数]]が存在する意義がない気がしますが...
改訂によってそのような機能を追加するべきではないということなのでしょうか。
[CODE(MIME)@en[[[text/plain]]]] に [CODE(MIME)@en[[[format]]]]
[[引数]]を後から追加したのは、かなり大きな変更のような気がしますが、
これは許されていいのですかねぇ。
[[木]]によって制約が緩和される理由もよくわかりません。
[196] その他の個別の[[引数]]は、各[[MIME型]]や[[最上位型]]の項を参照してください。
[REFS[
- [1] [CITE[OData Version 4.0 Part 1: Protocol Plus Errata 01]] ([TIME[2014-09-04 16:00:00 +09:00]] 版) <http://docs.oasis-open.org/odata/odata/v4.0/odata-v4.0-part1-protocol.html#_Toc393958670>
]REFS]
[232] [[引数]]によっては、必須とされているものもあります [SRC[>>223]]。
[235] 次の[[引数]]は、必須です。
[FIG(list)[
- [CODE(MIME)@en[[[multipart/[VAR[*]]]]]] [CODE(MIME)@en[[[boundary]]]]
- [CODE(MIME)@en[[[message/partial]]]] [CODE(MIME)@en[[[id]]]]
- [CODE(MIME)@en[[[message/partial]]]] [CODE(MIME)@en[[[number]]]]
- [CODE(MIME)@en[[[application/index.obj.[VAR[*]]]]]] [CODE(MIME)@en[[[dsi]]]]
- [CODE(MIME)@en[[[application/index.obj.[VAR[*]]]]]] [CODE(MIME)@en[[[base-uri]]]]
- [CODE(MIME)@en[[[application/index.response]]]] [CODE(MIME)@en[[[code]]]]
- [CODE(MIME)@en[[[application/index.cmd.poll]]]] [CODE(MIME)@en[[[type]]]]
- [CODE(MIME)@en[[[application/index.cmd.poll]]]] [CODE(MIME)@en[[[dsi]]]]
- [CODE(MIME)@en[[[application/index.cmd.datachanged]]]] [CODE(MIME)@en[[[type]]]]
- [CODE(MIME)@en[[[application/index.cmd.datachanged]]]] [CODE(MIME)@en[[[dsi]]]]
- [CODE(MIME)@en[[[application/vnd.pwg-multiplexed]]]] [CODE(MIME)@en[[[type]]]]
- [CODE(MIME)@en[[[application/shf+xml]]]] [CODE(MIME)@en[charset]]
- [CODE(MIME)@en[[[audio/G7221]]]] [CODE(MIME)@en[[[bitrate]]]]
- [CODE(MIME)@en[[[audio/DVI4]]]] [CODE(MIME)@en[[[rate]]]]
- [CODE(MIME)@en[[[audio/L8]]]] [CODE(MIME)@en[[[rate]]]]
- [CODE(MIME)@en[[[audio/L16]]]] [CODE(MIME)@en[[[rate]]]]
- [CODE(MIME)@en[[[audio/PCMA]]]] [CODE(MIME)@en[[[rate]]]]
- [CODE(MIME)@en[[[audio/PCMU]]]] [CODE(MIME)@en[[[rate]]]]
- [CODE(MIME)@en[[[application/cals-1840]]]] [CODE(MIME)@en[[[filename]]]]
- [CODE(MIME)@en[[[application/cals-1840]]]] [CODE(MIME)@en[[[version]]]]
- [CODE(MIME)@en[text/markdown]] [CODE(MIME)@en[charset]]
]FIG]
[220] 次の[[引数]]には[[自然言語]]文を記述できるようです。
[FIG(list)[
- [CODE(MIME)@en[[[name]]]] ([CODE(MIME)@en[[[application/octet-stream]]]])
]FIG]
* 分類
[179] 次の [[MIME型]]の分類があります。
[FIG(short list)[
- [[XML MIME型]]
- [[composite type]]
- [[font type]]
- [[JavaScript MIME型]]
- [[対応MIME型]]
]FIG]
* MIME 型の決め方
[281] 新しい[[MIME型]]を決める方法について、色々な人が色々なことを言っています。
[[IETF]] が発行する [[RFC]] の規定が最も「公式」と考えられていますが、
必ずしも実態に合っていませんし、何かと曖昧です。
[FIG(steps)[
= [282] 既に適当な [[MIME型]]があれば、新しい[[MIME型]]を作る必要はどこにもありません。
== [283] [[JSON]] を使っているなら、 [CODE(MIME)@en[[[application/json]]]] とします。
== [284] [[XML]] を使っているなら、 [CODE(MIME)@en[[[text/xml]]]] とします。
== [285] その他適切な[[MIME型]]があれば、それを使います。
= [286] それ以外の場合、
=-
=-
@@
]FIG]
* MIME 型の登録
[12] [[MIME]] は元々[[電子メール]]のための[[プロトコル]]であり、
[[相互運用性]]のために[[MIME型]]は限られた種類のみに限定することが好ましいと考えられていました
[SRC[>>35]]。そのため [[MIME型]]の [[IANA登録簿]]は用意されていましたが、
登録のハードルは高く設定されていました。
[44] しかし実際には既存の多くのファイル形式が[[添付ファイル]]や [[HTTP]]
でやり取りされるファイルなどの形で [[MIME]] および派生プロトコルの環境下で用いられるようになりました。
[[Windows]] や [[Linux]] 上の[[デスクトップ環境]]などでファイル形式を表す識別子
(の1つ) として [[MIME型]]が採用されたこともあり、ネットワーク上でやり取りされないファイル形式にも
[[MIME型]]が割り当てられるようになりました。
この結果、[[IANA登録簿]]に登録されていない [[MIME型]]が ([CODE[[[x-]]]] を使ったものも使わないものも含め)
相当数利用されることとなりました。
[96] 後に [[MIME型]]の登録手続きは緩和され、 [CODE[[[vnd.]]]] 木であれば比較的簡単に登録できるようになりました。
しかし既存の [[MIME型]]を [[IETF]] 側から積極的に [[IANA登録簿]]に登録しようとする動きはありません。
以前に比べれば [[IANA登録簿]]に登録される [[MIME型]]が多くなったとはいえ、
現実の利用状況と乖離しているという問題は解消されていません。
[163] 未登録の [[MIME型]]を使うべきではないと主張する人もいますが、
現実的ではありません。
[79] [[MIME型]]は、 [[BCP 13]] の手続きにより[[IANA]]に登録する[RUBYB[べき]@en[ought to]]です [SRC[>>71]]。
[167] [[MIME型]]として [[IANA登録簿]]に登録できるのは、
「[RUBYB[[[媒体]]書式]@en[media format]]」に限られます [SRC[>>166]]。
例えば [[Base64]] は[[内容転送符号化]]なので、 [[MIME型]]として登録することはできないとされています。
[168] この制約は [[MIME]] の仕組みに由来するもので、他の文脈には有用な区別ではないかもしれませんし、
曖昧です。これが[[IANA登録簿]]と現実が乖離する一因にもなっています。
[EG[
[169] [[gzip]] の [[MIME型]]は長らく [[IANA登録簿]]に登録されておらず、登録後も引き続き従来の色々な未登録の
[[MIME型]]が使われ続けています。
標準の[[MIME型]]が存在しないことが[[相互運用性]]の問題を引き起こしていただけでなく、
統一に失敗して複数の[[MIME型]]を恒久的に対応し続ける必要が生じてしまいました。
(しかもその重要な情報が [[RFC]] にも [[IANA登録簿]]には掲載されていません。
[[RFC]] だけ読んでも[[相互運用可能]]な実装は作れないということです。)
似たような現象が、例えば [CODE(MIME)@en[[[image/vnd.microsoft.icon]]]]
でも起こっています。こちらも正式な[[MIME型]]が登録されて10年以上経っても統一されていません。
]EG]
[EG[
[189] 同様に[[アーカイブ]]系ファイル形式もほとんどが登録されていません。
[CODE(MIME)@en[[[application/zip]]]] は1993年と早い時期に登録されているものの、
非推奨であり [CODE(MIME)@en[[[multipart/mixed]]]] を使うべきとの記述があります。
もちろん今となっては頓珍漢で誰も相手にしないような記述です。
]EG]
[180] [[最上位型]]は、 [[IETF]] の手続きで追加することは可能 [SRC[>>170]] ながら、
新たなものが必要なことは稀である [SRC[>>170]] として比較的高いハードルが設定されており、
私用の仕組みも用意されていません。これまでに正式に追加されたのは
[CODE(MIME)@en[[[model/*]]]] だけです。
[181] その他にも幾つか提案はありましたが、却下または立ち消えとなっています。
実際にはやはり他の[[最上位型]]に馴染まない [[MIME型]]は存在するので、
非標準のものが使われたり、 [CODE(MIME)@en[[[application/*]]]]
に押し込まれたりしています。
[209] 登録された[[MIME型]]は削除できません [SRC[>>208]]。
;; [247] しかし実際には [CODE(MIME)@en[[[application/xhtml-voice+xml]]]]
のように突然削除された例もあります。
[210] 登録された[[MIME型]]は[[廃止]] ([[OBSOLETE]]) 状態に変更することができます
[SRC[>>208]]。
;; [211] しかしこの[[廃止]]の意味は明確になっていません。[[廃止]]されているからといって、
それを利用してはならないとの明示的な規定は無さそうです。
[EG[
[213] 例えば [CODE(MIME)@en[[[text/javascript]]]] は[[廃止]]状態になっています。
しかし現実には [[JavaScript]] の[[MIME型]]として最も広く用いられている
[[MIME型]]なので、「[[廃止]]」とは一体どういう意味なのかは不明です。
]EG]
[212] なお他に状態らしきものとして非推奨 ([[DEPRECATED]]、
>>182 の Deprecated Alias とは別) や一時 (TEMPORARY) と注記されたものが
[[IANA登録簿]]上にありますが、これらが何を表しているのかは明確にはなっていません。
[[RFC]] にも言及がありません。
;; [265] [[IANA登録簿]]は [[XML]] 版もありますが、 [[IANA]] 内の都合に合わせたもので、
一般利用者向けに整備されているわけではないように見えます。部分型と
「(TEMPORARY - ・・・)」のような注記が混ざっていて、しかもある日突然新形式の注記が混ざったりするので、
機械的な利用にはあまり向きません。
[EG[
[266] [CODE(MIME)@en[[[text/markdown]]]] は、
[PRE[
markdown (temporary registered 2014-11-11, extension registered
2015-09-17, expires 2016-11-11)
]PRE]
... という謎の注記付き部分型で登録されています。
[TIME[2015-10-07T08:55:01.700Z]]
]EG]
* MIME 型の構文に従わない型
[5] [[MIME型]]のように「型/部分型」の構文となっていない値が [[MIME型]]と同じ文脈で使われることがあります。
[6] [CODE(822)@en[[[Content-Type:]]]] [[ヘッダー]]を [[MIME]]
以前から定義していた [[RFC 1049]] は、 [CODE[[[/]]]] が入らない型を規定していました。
;; [[RFC1049とInternet媒体型の対応]]参照。
[7] [[Atom]] の [[Text construct]] および [CODE(XMLe)@en[[[atom:content]]]]
[[要素]]の [CODE(XMLa)@en[[[type]]]] [[属性]]では、 [[MIME型]]以外に特殊な意味を持つ
[CODE(XML)@en[[[text]]]]、[CODE(XML)@en[[[html]]]]、[CODE(XML)@en[[[xhtml]]]]
を指定できます。
[8] [[Metalink]] の [CODE(XMLe)@en[[[metaurl]]]] [[要素]]の [CODE(XMLa)@en[[[mediatype]]]]
[[属性]]には [[MIME型]]以外に [CODE(XML)@en[[[torrent]]]] を指定できます。
* API
[269] [[DOM]] の [[API]] は基本的に [[MIME型]]を[[文字列]]として扱っています。
構文解析して部分を取り出したり、比較したりする標準の [[API]] はありません。
;; [255] [[MIME型]]を表す [CODE(DOMi)@en[[[MimeType]]]]
[[インターフェイス]]とその[[配列]]である [CODE(DOMi)@en[[[MimeTypeArray]]]]
[[インターフェイス]]がありますが、
[[プラグイン]]の [[API]] の一部ですから、汎用的なものではありません。
[270] [[プログラミング言語]]の[[ライブラリー]]等の中には、[[MIME型]]を操作する
[[API]] を提供するものもあります。しかし一般的には、
[[MIME型]]は[[文字列]]ないしは[[バイト列]]として操作されることが多いと思われます。
;; [271] そのため[[引数]]の扱いや[[大文字]]と[[小文字]]の扱いなどで不具合を誘発しています。
問題を避けるためにも、[[引数]]はできるだけ使うべきではありませんし、
[[MIME型]]はすべて[[小文字]]表記とするのが無難でしょう。
* パターン
[86] [[MIME型]]の集合を表す構文がいくつかあります。
[FIG(list)[
- [[媒体範囲]] ([CODE(HTTP)@en[[[Accept:]]]] [[ヘッダー]])
- [[HTML]] [CODE(HTMLa)@en[[[accept]]]] [[属性]]
]FIG]
* 文脈
[94] [[MIME型]]は色々なところで利用されています。
[FIG(middle list)[
- [CODE(MIME)@en[[[Content-Type:]]]]
- [CODE(HTTP)@en[[[Accept:]]]]
- [CODE(HTTP)@en[[[Content-Style-Type:]]]]
- [CODE(HTTP)@en[[[Content-Script-Type:]]]]
- [CODE(HTMLa)@en[[[type]]]] [[属性]] ([[HTML]])
- [CODE(MIME)@en[[[type]]]] [[引数]] ([CODE(MIME)@en[[[application/vnd.pwg-multiplexed]]]])
- [CODE(HTMLa)@en[[[accept]]]]
- [CODE(HTMLa)@en[[[enctype]]]]
- [CODE(HTMLa)@en[[[srctype]]]]
- [CODE(XMLa)@en[[[contentStyleType]]]]
- [CODE(XMLa)@en[[[contentScriptType]]]]
- [CODE(DOMa)@en[[[contentType]]]]
- [CODE(DOMm)@en[[[overrideMimeType]]]]
- [CODE(URI)@en[[[data:]]]]
- [CODE(URI)@en[[[ct=]]]]
- [CODE(JS)@en[[[navigator.mimeTypes]]]]
- [CODE(MIME)@en[preview-type]]
]FIG]
[187] [[MIME型]]に関わる次のプロトコルがあります。
[FIG(middle list)[
- [[MIME]]
- [[HTTP]]
- [[MIME Sniffing]]
- [CODE(HTTP)@en[[[X-Content-Type-Options:]]]]
- [CODE(HTMLa)@en[[[typemustmatch]]]]
- [[素片識別子]]
- [CODE(HTMLa)@en[[[language]]]] [[属性]]
]FIG]
[272] [[Web]] を含む[[インターネット]]では[[MIME型]]がデータ型を表記する[[政治的に正しい]]方法とされています。
[[IETF]] や [[W3C]] などの公式な[[標準仕様]]が規定する技術は、
もっぱら[[MIME型]]を用いるのが普通です。
[273] しかし現実は必ずしもそうなっているわけではありません。特に [[Web]]
では、[[拡張子]]や [[MIME Sniffing]] が [[MIME型]]と併用されています。
[EG[
[274] [CODE(HTMLe)@en[[[input]]]] [[要素]]の [CODE(HTMLa)@en[[[accept]]]]
[[属性]]では、[[MIME型]]だけでなく[[拡張子]]も指定できます。
]EG]
** ファイルシステムと MIME 型
@@ [268] XXX
** RTP
[267] [[RTP]] は [[MIME型]]の指定に ([[RTP]] の他の部分と整合した) 独特の構文を採用しています。
また [[RTP]] で使う [[MIME型]]とそれ以外の[[プロトコル]]で使う[[MIME型]]のほとんどは重なりません。
([[RTP]] で使うことができるデータ形式は「[[framed]]」と呼ばれています。)
登録手続きは一応共通ですが、別の特別な [[RFC]] で規定されています (>>130)。
実質的に従来の[[MIME型]]とは異なる別のデータ形式記述方式ですが、
[[IETF]] 内で複数の似たものが存在するのは良くないとの[[政治的]]な理由からなのか、
無理矢理に統合されているように見えます。
* 処理
[239] 処理方法は、個々の [[MIME型]]によります。
[240] 未知の[[最上位型]]をどう処理するべきか [[RFC 2046]] は明記していません。
が [CODE(MIME)@en[[[application/octet-stream]]]] のように扱うべきと思われます。
* 比較
[254] [CODE(HTMLe)@en[[[object]]]] [[要素]]の処理では、[[引数]]も含めて
[[ASCII大文字・小文字不区別]]で比較されます。
* 他の識別子との関係
[206] [[MIME型]]の [[IANA登録簿]]は、[[拡張子]]や[[魔法数]]、
[[Mac OS File Type]] といった識別子を (あれば) 登録時に記述することを推奨しています。
[207] [[Apache]] や [[Windows]] をはじめ多くの [[MIME型]]の実装は、
[[ファイルシステム]]上の[[ファイル]]の [[MIME型]]を決定する際に[[ファイル名]]の[[拡張子]]を使っています。
;; ただし[[拡張子]]と [[MIME型]]の関係は多対多であり、確実に決定することはできません。
また[[拡張子]]がない [[MIME型]]や [[MIME型]]がない[[拡張子]]も珍しくありません。
* 歴史
[101] [[MIME型]]の前身となるものは [[RFC 1048]] で規定されていました。
後に [[MIME]] により現在の「型/部分型」の形に変更されました。
** RFC 1049
[81] [[RFC1049とInternet媒体型の対応]]参照。
** MIME
[236] [[MIME型]]は [[RFC 1341]]、[[RFC 1521]] を経て [[RFC 2046]]
で規定されています。
[241] [[RFC 2046]] は [[RFC 822]] の [[ABNF]] を採用しているように見えますが、
明記されていません。
[242] 多くの[[引数]]の構文は明記されていません。旧版の [[RFC 1521]] には [[ABNF]]
があったのに、なぜか削除され、退化しています。
[REFS[
- RFC 1341 <urn:ietf:rfc:1341> (廃止)
- RFC 1437 <urn:ietf:rfc:1437> matter-transport/* 媒体型
- RFC 1521 <urn:ietf:rfc:1521> (廃止)
- RFC 2046 <urn:ietf:rfc:2046> 媒体型
- RFC 2376 <urn:ietf:rfc:2376> XML 媒体型 (廃止)
- RFC 3023 <urn:ietf:rfc:3023> XML 媒体型
- [30] [[IANA登録簿]] <http://www.iana.org/assignments/media-types/>
-- [132] [CITE[IANA | MIME Media Types]] ([TIME[2015-04-19 12:15:10 +09:00]] 版) <http://web.archive.org/web/20020805230715/http://www.iana.org/assignments/media-types/>
]REFS]
[237] [[RFC 2046]] は次の通り部分的に[[更新]]されています。
[FIG(list)[
- [[RFC 2646]] - [CODE(MIME)@en[[[text/plain]]; [[format]]]] [[引数]]の追加
- [[RFC 3798]] - [CODE(MIME)@en[[[message/partial]]]] の規定の追加
- [[RFC 5147]] - [CODE(MIME)@en[[[text/plain]]]] の[[素片識別子]]
- [[RFC 6657]] - [CODE(MIME)@en[[[charset]]]] [[引数]]の既定値の改訂
]FIG]
;; [243] 登録手続きの改訂版である [[RFC 4288]] が [[RFC 2046]]
の一部規定をコピペ改訂しているようですが、なぜか[[更新]]とはなっていません。
[[RFC 2046]] と登録手続きの [[RFC]] は内容に重複がありつつ完全な整合性は無く、
解釈が難しい状態です。
[103] [[MIME型]]の登録手続きは当初 [[RFC 1341]] [SRC[>>102]]、[[RFC 1521]] [SRC[>>106]] と
[[MIME]] 第1部の[[附属書]]で規定されていました。
[REFS[
- [106] [CITE@en[RFC 1341 - MIME (Multipurpose Internet Mail Extensions): Mechanisms for Specifying and Describing the Format of Internet Message Bodies]] ([TIME[2015-02-01 12:14:56 +09:00]] 版) <http://tools.ietf.org/html/rfc1341#page-52>
- [102] [CITE@en[RFC 1341 - MIME (Multipurpose Internet Mail Extensions): Mechanisms for Specifying and Describing the Format of Internet Message Bodies]] ([TIME[2015-02-01 12:14:56 +09:00]] 版) <http://tools.ietf.org/html/rfc1341#page-68>
- [107] [CITE@en[RFC 1521 - MIME (Multipurpose Internet Mail Extensions) Part One: Mechanisms for Specifying and Describing the Format of Internet Message Bodies]] ([TIME[2015-03-15 13:27:10 +09:00]] 版) <http://tools.ietf.org/html/rfc1521#page-55>
- [105] [CITE@en[RFC 1521 - MIME (Multipurpose Internet Mail Extensions) Part One: Mechanisms for Specifying and Describing the Format of Internet Message Bodies]] ([TIME[2015-03-15 13:27:10 +09:00]] 版) <http://tools.ietf.org/html/rfc1521#page-72>
]REFS]
[FIG(quote)[
[FIGCAPTION[
[90] RFC 2046 2. Definition of a Top-Level Media Type
]FIGCAPTION]
The definition of a top-level media type consists of: