[28] [[実体]]を ([[媒体型]]や[[文字符号化]]とは別に) [[符号化]]する仕組みとして、 [[HTTP]] には[[内容符号化]]と[[転送符号化]]、[[MIME]] には[[内容転送符号化]]があります。 [29] [DFN[[[内容符号化]]]]は、本来の意味的には転送される[[実体]]の本質的な一部となった[[符号化]]を表します。 例えば、 [[gzip]] [[圧縮]]された[[ファイル]]を転送する場合、[[内容符号化]]が [[gzip]] であるといえます。一方[DFN[[[転送符号化]]]]は、転送時の都合上の一時的な[[符号化]]を表します。 [[HTTP/1.1]] では[[実体本体]]全体の長さがわからなくても少しずつ転送を繰り返す [[chunked]] [[符号化]]の仕組みがありますが、こちらは[[転送符号化]]です。ただし、 歴史的理由により本来[[転送符号化]]であるものが[[内容符号化]]によって転送されたり、 [[内容符号化]]であるものが[[転送符号化]]であったかのように扱われたりすることがあります。 [[HTTP]]、[[RTSP]]、[[SIP]] では[[内容符号化]]の識別に [CODE(HTTP)@en[[[Content-Encoding:]]]] [[頭欄]]、[[転送符号化]]の識別に [CODE(HTTP)@en[[[Transfer-Encoding:]]]] [[頭欄]]を使います。 [[内容折衝]]のために[[内容符号化]]では [CODE(HTTP)@en[[[Accept-Encoding:]]]] [[頭欄]]、 [[転送符号化]]では [CODE(HTTP)@en[[[TE:]]]] [[頭欄]]が用いられます。 [37] [DFN[[[内容転送符号化]]]]は、[[実体]]の転送時の都合上の一時的な[[符号化]]を表します。 その意味で [[HTTP]] の[[転送符号化]]に近い概念です。 [[MIME]] では[[内容転送符号化]]の識別に [CODE(MIME)@en[[[Content-Transfer-Encoding:]]]] [[頭欄]]を使います。 * 値 [3] [[内容符号化]]、[[転送符号化]]、[[内容転送符号化]]の名前を表す値はいずれも[[大文字・小文字を区別しない]]とされています。 ;; ただし、これらを指定する[[頭欄]]で[[引数]]を指定できる場合、その値まで[[大文字・小文字を区別しない]]とは限らないことに注意してください。 [31] [[内容符号化]]と[[転送符号化]]で使える値の集合は別々ですが、 重なりがあって、実際上も[[内容符号化]]と[[転送符号化]]が混用されています。 [32] また、本来 [[MIME]] の[[内容転送符号化]]であり、 [[HTTP]] では意味を成さない値も[[内容符号化]]として誤用されていることがあります。 ** 私用の値 [4] [[内容符号化]]、[[転送符号化]]、[[内容転送符号化]]のいずれでも、例によって [CODE@en[[[x-]]]] から始まる値は[[私用]]のために予約されています。 [30] ただし、 [[RFC 1945]] [[HTTP/1.0]] の定義だけは変則的で、 [CODE(HTTP)@en[[[x-gzip]]]] のような [CODE(HTTP)@en[[[x-]]]] がついた名前の方だけが規定に含まれています。 ** 内容符号化の値 [5] ,*名前,*説明,*状態,*出典 ,[CODE(HTTP)@en[[[7bit]]]],,非標準 ,[CODE(HTTP)@en[[[8bit]]]],,非標準 ,[CODE(HTTP)@en[[[base64]]]],,非標準 ,[CODE(HTTP)@en[[[binary]]]],,非標準 ,[CODE(HTTP)@en[[[bzip]]]],[[bzip]],非標準 ,[CODE(HTTP)@en[[[x-bzip]]]],[[bzip]],非標準 ,[CODE(HTTP)@en[[[bzip2]]]],[[bzip]],非標準 ,[CODE(HTTP)@en[[[x-bzip2]]]],[[bzip]],非標準 ,[CODE(HTTP)@en[[[compress]]]],[[compress]],[[IETF]] [[原案標準]],"[[RFC 2616]], [[IANAREG]]" ,[CODE(HTTP)@en[[[x-compress]],[[compress]],[[IETF]] [[情報提供RFC]] → [CODE(HTTP)@en[[[compress]]]],[[RFC 1945]] ,[CODE(HTTP)@en[[[deflate]]]],[[deflate]],[[IETF]] [[原案標準]],"[[RFC 2616]], [[IANAREG]]" ,[CODE(HTTP)@en[[[x-deflate]],[[deflate]],→ [CODE(HTTP)@en[[[deflate]]]] ,[CODE(HTTP)@en[[[exi]]]],[[EXI]],[[W3C]] [[作業原案]],"[[EXI]], [[IANAREG]]" ,[CODE(HTTP)@en[[[gzip]]]],[[gzip]],[[IETF]] [[原案標準]],"[[RFC 2616]], [[IANAREG]]" ,[CODE(HTTP)@en[[[x-gzip]],[[gzip]],[[IETF]] [[情報提供RFC]] → [CODE(HTTP)@en[[[gzip]]]],[[RFC 1945]] ,[CODE(HTTP)@en[[[x-hqx]]]],[[BinHex]], ,[CODE(HTTP)@en[[[identity]]]],変形なし,[[IETF]] [[原案標準]],"[[RFC 2616]], [[IANAREG]]" ,[CODE(HTTP)@en[[[pack200-gzip]]]],,[[JSR]],"[[JSR#200]], [[IANAREG]]" ,[CODE(HTTP)@en[[[quoted-printable]]]],,非標準 ,[CODE(HTTP)@en[[[text/html]]]],,非標準 ,[CODE(HTTP)@en[[[text/plain]]]],,非標準 ,[CODE(HTTP)@en[[[x-zip]]]],[[compress]],→ [CODE(HTTP)@en[[[compress]]]] [26] 多分変てこなロボットだと思うんですが、 なぜか [CODE(HTTP)[Accept-Encoding]] に [CODE(HTTP)[text/html]] とか [CODE(HTTP)[text/plain]] とか送ってくる奴がいます。数でいうと結構出現頻度が高い。 (同じ奴ばっかだと思うけど。) [1] [CODE(HTTP)[[[Accept-Encoding:]]]] 欄に [CODE(HTTP)[[[7bit]], [CODE(HTTP)[[[8bit]]]], [CODE(HTTP)[[[binary]]]] とか書く [[UA]] があるらしい。 なんか勘違いしているような気がする。 [6] [CODE(HTTP)[x-compress]], [CODE(HTTP)[x-gzip]] は、 [[HTTP/1.1]] が分かる相手には使うべきではありません。 逆に [CODE(HTTP)[compress]], [CODE(HTTP)[gzip]] は、 [[HTTP/1.0]] しか分からない相手に使うべきではありません。 [27] 今時は HTTP/1.0 の実装でも [CODE(HTTP)[x-gzip]] は知ってるけど [CODE(HTTP)[gzip]] は知らないなんてのは無いみたいです。 [CODE(HTTP)[Accept-Encoding]] も [CODE(HTTP)[gzip]] で送ってくるのがほとんど。 ([CODE(HTTP)[x-gzip]] ''も''送ってくる奴も結構いますが。) ** 転送符号化の値 [35] ,*名前,*説明,*状態,*出典 ,[CODE(HTTP)@en[[[chunked]]]],[[chunked]] [[符号化]],[[IETF]] [[原案標準]],"[[RFC 2616]], [[IANAREG]]" ,[CODE(HTTP)@en[[[compress]]]],[[UNIX]] [[compress]],[[IETF]] [[原案標準]],"[[RFC 2616]], [[IANAREG]]" ,[CODE(HTTP)@en[[[deflate]]]],[[deflate]],[[IETF]] [[原案標準]],"[[RFC 2616]], [[IANAREG]]" ,[CODE(HTTP)@en[[[gzip]]]],[[gzip]],[[IETF]] [[原案標準]],"[[RFC 2616]], [[IANAREG]]" ,[CODE(HTTP)@en[[[identity]]]],変形なし,[DEL[[[IETF]] [[原案標準]]]],"[DEL[[[RFC 2616]]]], [[RFC 2616]] [[正誤表]] (取り下げ), [[IANAREG]]" ,[CODE(HTTP)@en[[[trailer]]]],[CODE(HTTP)@en[[[Trailer:]]]] [[頭欄]],[[IETF]] [[原案標準]],[[RFC 2616]] [25] 値 "trailers" は転送符号化ではありませんが、 [CODE(HTTP)[TE:]] 欄では転送符号化に準じて扱われています。 *** IANA 登録簿 [33] [[内容符号化]]と[[転送符号化]]の値は [[IANA登録簿]] で示されています。 [34] 登録手続きは > Registration Procedures: First Come First Served with specification recommended ([[先来先給]]、仕様書推奨) とされています。 * 転送符号化か内容符号化か [24] 以前は [[IANAREG]] には[[転送符号化]]として [CODE(HTTP)@en[[[chunked]]]] しか登録されておらず、 [[RFC 2616]] で [CODE(HTTP)@en[[[Transfer-Encoding:]]]] 欄でも[[転送符号化]]として指定できるよう拡張された ([[RFC 2068]] ではそうなっていなかった) [CODE(HTTP)@en[[[gzip]]]] などの値はありませんでした。 [36] もしかすると単なる転送のための圧縮は内容符号化ではなく転送符号化を使うべし、という意思が働いているのかもしれません... (そうすれば、[[ダウンロード]]した [CODE(file)@en[[VAR[*]].gz]] ファイルが勝手に展開されている、という問題は防げるようになるでしょうし。) [11] [[mod_gzip]] とか流行ってるわけですが、ほんとは転送上の圧縮は [CODE(HTTP)[Content-Encoding]] じゃなくて [CODE(HTTP)[[[Transfar-Encoding]]]] 使うべきじゃないんですかね。もっとも、主要 [[UA]] で対応しているのは [[Opera]] だけという有様ですが。。。 (一方内容符号化はほとんどの主要 UA で扱えるから。。。) [15] ファイルとして保存する時に UA が [CODE(HTTP)[Content-Encoding]] (特に [CODE(HTTP)[gzip]] を展開してしまい、利用者は圧縮したものを受取ったつもりでいて混乱するという問題が多発していまして、 内容折衝するのでもなければ [CODE(HTTP)[Content-Encoding]] は使うべきではないという意見すらありますね。 本当は保存時に展開するかどうかを UA が利用者に尋ねるのが良いのでしょう。 転送のためだけの圧縮も、 >>11 の言うように [CODE(HTTP)[Content-Encoding]] は使わずに [CODE(HTTP)[Transfer-Encoding]] にした方がいいでしょう。 [CODE(HTTP)[Transfer-Encoding]] に [CODE(HTTP)[gzip]] などが追加されたのはこの問題もたぶん考えてのことでしょう [WEAK[(という理由もあったのかどうかは調べてみないと分かりませんが)]]。